日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Jpeglib使用指南, 各种压缩包的压缩和解压方法, 开源社区分裂史

發(fā)布時(shí)間:2023/12/20 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Jpeglib使用指南, 各种压缩包的压缩和解压方法, 开源社区分裂史 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

http://antkillerfarm.github.io/

Jpeglib使用指南

1.問題的由來

Jpeg圖片在圖像處理領(lǐng)域已經(jīng)用的相當(dāng)廣泛了。但在編程領(lǐng)域,尤其是嵌入式編程領(lǐng)域使用的還不是很廣。主要的原因是Jpeg的數(shù)據(jù)結(jié)構(gòu)和算法遠(yuǎn)較bmp復(fù)雜,非圖像算法的專業(yè)人士,通常是無法理解這些的。(我有個(gè)同事,他曾經(jīng)花了半個(gè)月,研究過Jpeg的原理,還為此在team內(nèi)部舉辦了一個(gè)講座,講了足足有一個(gè)小時(shí),令眾人對之仰慕萬分,但他卻說,僅得皮毛,未得要害。從此我對Jpeg的原理敬而遠(yuǎn)之。)

近來,因工作需要,要在wince平臺下,為程序添加Jpeg支持。一般來說,此類問題最容易的解決方案是使用OS提供的相關(guān)庫,畢竟現(xiàn)在不支持Jpeg的OS幾乎沒有。但在wince下這里出了個(gè)問題。目前絕大多數(shù)的wince設(shè)備是wince 4.X或5.X的,不過碰巧在圖像處理這塊,5.X和4.X的方法是不一樣的。4.X提供的方法在IMGDECMP.DLL中,而5.X提供的方法在Imaging.DLL中,而且不止是鏈接庫不同,庫的接口也是完全兩樣的。因此,如果軟件采用OS提供的相關(guān)庫的話,在這里就要準(zhǔn)備兩套接口,非常的麻煩。況且,我們的軟件不僅要在wince下部署,將來還打算推廣到其他的平臺,因此這種方案顯然是不太好的。

這時(shí)我想到了JpegLib。JpegLib是Independent JPEG Group——一個(gè)非Jpeg官方組織推出的Jpeg庫。這是個(gè)開源免費(fèi)的庫,支持多種平臺和編譯器,你可以在www.ijg.org中獲得它的最新版本。在PC上它的效率比不了intel的Jpeg庫,因?yàn)楹笳哌M(jìn)行了匯編優(yōu)化。但在wince上應(yīng)該和系統(tǒng)庫的效率相當(dāng)。事實(shí)上如果查看系統(tǒng)的版權(quán)信息的話,Microsoft在wince中也使用了這個(gè)庫。RISC的芯片也基本沒有匯編優(yōu)化的問題。

網(wǎng)上的中文資料以以下兩篇文章最為詳盡。

http://mobile.winfans.net/ccs/forums/516/PrintPost.aspx (文獻(xiàn)A)

http://blog.csdn.net/zhao3728/archive/2007/08/22/1754877.aspx (文獻(xiàn)B)

所以我的這篇文章主要作為補(bǔ)遺之用。

2.編譯JpegLib庫

文獻(xiàn)A和B都是使用現(xiàn)成的JpegLib庫,這樣的庫只在特定的平臺下才能用,完全體現(xiàn)不出JpegLib的優(yōu)勢。所以掌握編譯JpegLib庫的方法,是很有必要的。

JpegLib庫源代碼的組成

1)makefile。JpegLib庫中有很多文件名為makefile的文件。它的后綴名表示它所用于的平臺或用途。隨便打開一個(gè),就可以看到JpegLib庫源代碼的組成。

2)makefile中LIBSOURCES變量所代表的文件是JpegLib的核心算法部分。

3)makefile中SYSDEPSOURCES變量所代表的文件是JpegLib中負(fù)責(zé)內(nèi)存分配的部分。這部分是系統(tǒng)相關(guān)的,所以根據(jù)需要選用一個(gè)就行了。

4)makefile中APPSOURCES變量所代表的文件是JpegLib中提供諸如命令行壓縮Jpeg之類的功能的部分,實(shí)際上就是一些小工具。不過在編譯JpegLib庫時(shí),不要將之添加到工程中。

5)makefile中INCLUDES變量所代表的文件是源代碼中用到的頭文件。不是所有的頭文件都被核心算法部分使用到,因此有些頭文件在編譯JpegLib庫時(shí),是不必要的,當(dāng)然將之添加到工程中也不會出錯(cuò)。

6)makefile中DOCS變量所代表的文件是一些文檔、測試用例之類的東西。其中最有用的是example.c,文獻(xiàn)A和B的示例最重要的部分,就來自這里。

7)jconfig。JpegLib庫中還有很多和makefile類似的jconfig,這是針對不同平臺的類型聲明。在使用時(shí),應(yīng)根據(jù)需要,將適當(dāng)?shù)膉config文件的后綴名改為h。

以上這些內(nèi)容更詳細(xì)的說明見JpegLib庫的文檔,以及

http://blog.csdn.net/axlrosek/archive/2007/03/29/1545496.aspx

VC:不同版本的VC、EVC都差不多,參照文獻(xiàn)A的步驟修改相關(guān)文件,然后新建一個(gè)空工程,然后打開JpegLib中的makefile.vc文件,將2)和3)、5)、7)中的文件添加到工程中。將生成文件的類型定為lib就行了。此外,還需要針對調(diào)用的情況選擇適當(dāng)?shù)倪\(yùn)行時(shí)庫,否則可能會出LNK2005錯(cuò)誤。

3.使用JpegLib庫

JpegLib庫的使用參照文獻(xiàn)A和B,以及example.c就可以了。但文獻(xiàn)A的示例是有問題的。

bmpBuffer[start+i]=pBuffer[0];

應(yīng)改為

bmpBuffer[start+i]=pBuffer[0][i];

jpeg_read_scanlines(&cinfo, pBuffer, 1)執(zhí)行之后,掃描線的內(nèi)容被放到pBuffer[0],而不是pBuffer中,用memcpy將掃描線的內(nèi)容轉(zhuǎn)移到其他的緩沖區(qū)就行了,無需用循環(huán)語句。

4.流輸入的Jpeg的處理

上面的示例處理的都是從文件讀入的Jpeg,在現(xiàn)實(shí)中,還存在流輸入的Jpeg。在很多PC游戲中,程序的數(shù)據(jù)都被集中起來放入一個(gè)大文件之中,最典型的當(dāng)屬暴雪的mpq文件。當(dāng)這些文件被讀入內(nèi)存時(shí),就形成了字節(jié)流形式的文件。將之存為臨時(shí)文件,然后再用之前的方法,顯然是笨方法。這時(shí)可以采用jpeg_arr_src函數(shù)來替換jpeg_stdio_src函數(shù)。

這一點(diǎn)還可以參考以下文檔,不過該文針對的好像是舊版本,使用時(shí)要注意。

http://blog.china.com/u/060803/5544/200608/15355.html

各種壓縮包的壓縮和解壓方法

.tar.gz

解壓:tar zxvf FileName.tar.gz

壓縮:tar zcvf FileName.tar.gz DirName

PS:tar命令對于長選項(xiàng)和短選項(xiàng)的順序有要求,例如,不覆蓋已有文件的選項(xiàng)--skip-old-files:

tar --skip-old-files -zxvf FileName.tar.gz #正確

tar -zxvf --skip-old-files FileName.tar.gz #錯(cuò)誤

.tar

解包:tar xvf FileName.tar

打包:tar cvf FileName.tar DirName

(注:tar是打包,不是壓縮!)

.gz

解壓1:gunzip FileName.gz

解壓2:gzip -d FileName.gz

壓縮:gzip FileName

.tar.gz 和 .tgz

解壓:tar zxvf FileName.Tar.gz

壓縮:tar zcvf FileName.Tar.gz DirName

.bz2

解壓1:bzip2 -d FileName.bz2

解壓2:bunzip2 FileName.bz2

壓縮: bzip2 -z FileName

.tar.bz2

解壓:tar jxvf FileName.tar.bz2

壓縮:tar jcvf FileName.tar.bz2 DirName

.bz

解壓1:bzip2 -d FileName.bz

解壓2:bunzip2 FileName.bz

.tar.bz

解壓:tar jxvf FileName.tar.bz

.Z

解壓:uncompress FileName.Z

壓縮:compress FileName

.tar.z

解壓:tar Zxvf FileName.tar.z

壓縮:tar Zcvf FileName.tar.z DirName

.zip

解壓:unzip FileName.zip

壓縮:zip FileName.zip DirName

.rar

解壓:rar x FileName.rar

壓縮:rar a FileName.rar DirName

.lha

解壓:lha -e FileName.lha

壓縮:lha -a FileName.lha FileName

.rpm

解包:rpm2cpio FileName.rpm | cpio -div

.deb

解包:ar p FileName.deb data.Tar.gz | Tar zxf -

萬能腳本

解壓:sEx x FileName.*

壓縮:sEx a FileName.* FileName

sEx只是調(diào)用相關(guān)程序,本身并無壓縮、解壓功能,請注意!

sEx請到: http://sourceforge.net/projects/sex下載!

betty

betty是Jeff Pickhardt開發(fā)的人工智能助手,可以將英文轉(zhuǎn)換成Linux命令。

安裝方法如下:

sudo apt-get install git curl ruby cd ~ git clone https://github.com/pickhardt/betty sudo nano ~/.bashrc

在.bashrc末尾添加以下內(nèi)容:

alias betty="/home/sk/betty/main.rb"

重啟終端即可。

使用方法:

betty compress test/ test.tar.gz

開源社區(qū)分裂史

有人的地方,就有江湖,開源社區(qū)也同樣如此。本來一個(gè)戰(zhàn)壕的弟兄,因?yàn)榉N種原因,而分道揚(yáng)鑣(或者專業(yè)一點(diǎn)叫做fork),從而導(dǎo)致社區(qū)的分裂,這并不是什么稀罕事。比如最知名的開源軟件Linux,在早期的時(shí)候,就有所謂的ac分支,也就是Alan Cox發(fā)布的分支。只不過Alan Cox沒有另起山頭,因此這個(gè)只算分支,而不算分裂。但本文下面所要講述的,可就不是這么小打小鬧了。

ffmpeg vs libav

2011年的時(shí)候,一群ffmpeg開發(fā)者,由于對項(xiàng)目管理者(肯定不是Fabrice Bellard,從log可以看出,這位老兄當(dāng)時(shí)已經(jīng)不管這個(gè)項(xiàng)目很多年了。)不滿,而另立山頭,創(chuàng)建了libav項(xiàng)目。這從兩個(gè)項(xiàng)目的圖標(biāo)就可以看出來。話說libav的圖標(biāo)其實(shí)是ffmpeg早先的圖標(biāo),只不過圖標(biāo)的創(chuàng)建者加入了libav項(xiàng)目,因此ffmpeg不得不換了一個(gè)類似的圖標(biāo)。

應(yīng)該說libav項(xiàng)目開局時(shí)的思路還是比較好的。但ffmpeg畢竟是個(gè)老項(xiàng)目,即使因?yàn)閼T性,也足以繼續(xù)吸引開發(fā)者開發(fā)并使用。這從提交的次數(shù)就可以看的很明顯,從2011年8月(也就是libav起義時(shí))到2012年底,libav提交6600次,而ffmpeg同期提交了16600次!

當(dāng)然,ffmpeg項(xiàng)目提交的內(nèi)容實(shí)際上有很多都來自libav。Libav開發(fā)者指責(zé)FFmpeg項(xiàng)目負(fù)責(zé)人Michael Niedermayer盜用了他們的成果。據(jù)說Michael將Libav的代碼合并到FFmpeg,讓他成為了FFmpeg最大的貢獻(xiàn)者,他遞交的代碼一度占了新增代碼的80%。但正是因?yàn)橛羞@樣的搬運(yùn)工的存在,使得ffmpeg最終贏得了這場競爭。

2011年的時(shí)候,由于Debian的一個(gè)維護(hù)者,本身加入了libav項(xiàng)目的緣故,導(dǎo)致Debian/Ubuntu這個(gè)linux最大的發(fā)行版采用了libav。(典型的以權(quán)謀私,哈哈)但最終到了2015年,Debian社區(qū)在歷時(shí)一年的討論之后,還是放棄了libav項(xiàng)目。

結(jié)論:ffmpeg勝。一般來說,后來者需要付出更大的努力,才能奪取先行者的領(lǐng)先地位。而ffmpeg在市場領(lǐng)先的情況下,仍采取虛心接納的策略,基本杜絕了libav勝出的可能性。

OpenOffice vs LibreOffice

同樣是2011年,LibreOffice從OpenOffice中fork出來。fork的原因是由于Oracle收購Sun。眾所周知,Oracle是僅次于MS的開源社區(qū)二號公敵。因此當(dāng)Google挑頭發(fā)起LibreOffice項(xiàng)目之后,開發(fā)者幾乎一邊倒的投向LibreOffice,基本沒花什么功夫就打垮了OpenOffice。

結(jié)論:LibreOffice勝。開源軟件的生命力和魅力都在于開源,人心向背是開源軟件勝負(fù)的根本。

DivX vs Xvid

DivX本來是個(gè)開源項(xiàng)目。但有一天,幾個(gè)項(xiàng)目管理者建立了一個(gè)商業(yè)公司,出于商業(yè)目的,而將其變成了閉源項(xiàng)目。這樣一來,就激怒了為該項(xiàng)目無償貢獻(xiàn)代碼的開源社區(qū)。作為回應(yīng),開源社區(qū)發(fā)起了Xvid項(xiàng)目。

事情的結(jié)局有點(diǎn)童話色彩:開源的Xvid最終戰(zhàn)勝了不厚道的DivX。但背后的邏輯并沒有那么童話。開源軟件由于擁有成本為0,天生就是商業(yè)軟件,尤其是收費(fèi)商業(yè)軟件的克星,這其實(shí)是經(jīng)濟(jì)規(guī)律在起作用。一般來說,如果以100分為滿分,免費(fèi)軟件只要拿80分,收費(fèi)軟件就沒有什么戲了。而開源軟件只要拿70分,閉源軟件也同樣沒戲了。

總結(jié)

以上是生活随笔為你收集整理的Jpeglib使用指南, 各种压缩包的压缩和解压方法, 开源社区分裂史的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。