類完成jni方法,并且確保在多線程環(huán)境下,多個freeimage對象同時進(jìn)行圖像解碼。因為Freeimage使用的是libjpeg, Iibpng這些庫完成的png, jpeg解碼功能,所以可以直接使用ndk編譯Freeimage庫和jpeg_turbo庫,jpeg_turbo是對jpeg解碼進(jìn)行優(yōu)化的,能加快大概15%的速度。并且修改Freeimage中jpeg的代碼,全部替換為jpeg_turbo的代碼,并且完成jpeg_turbo中匯編文件的編譯鏈接。最后,使用NDK編譯鏈接Freeimage,jpeg_Turbo, jni,生成so文件,并且把它放到Iib下面,添加到eclipse環(huán)境中,使這個基本框架能和imageloader協(xié)同運(yùn)行。
[0029]現(xiàn)在,通過上述搭建系統(tǒng)開始對原圖像進(jìn)行縮略圖的生成,據(jù)圖包括以下步驟:
[0030]首先,在Freeimage添加一個函數(shù)專門作為縮略圖加載用,這個函數(shù)可以通過拷貝load方法的代碼,快速生成。讀取原圖像頭文件信息,結(jié)合縮略圖尺寸,生成縮略圖頭信息并將其存儲至縮略圖文件并據(jù)原圖像頭文件信息縮略圖頭信息至少包括縮略圖的寬度,高度、像素的字節(jié)數(shù)、像素寬度及調(diào)色板信息。
[0031]然后需要根據(jù)縮略圖尺寸然后計算出采樣率。采樣率包括行采樣率,所述行采樣率值為原圖像的行寬度除以縮略圖的行寬度然后取整得到;還包括列采樣率,列采樣率值為原圖像的列高度除以縮略圖的列高度然后取整得到。
[0032]然后在Freeimage中添加根據(jù)上述方法所得到的采樣率計算公式來獲得采樣率,公式內(nèi)容如下:
[0033](unsigned simpleSizeff = cinf0.0utput_width/width ;
[0034]unsigned simpleSizeH = cinf0.0utput_height/height ;
[0035]unsignedsimpleSize = impleSizeW〈 simpleSizeH ?simpleSizeff:simpleSizeH)。
[0036]然后在FreeImage_Al1cateHeader中將傳入的生成頭的寬度和高度修改為縮略圖的寬高,例如:
[0037]Freeimage_AIlocateHeader (header_only, width/*cinf0.0utput_width*/, height/*cinf0.0utput_height*/,32,F(xiàn)I_RGBA_RED_MASK, FI_RGBA_GREEN_MASK, FI_RGBA_BLUE_MASK)。
[0038]這樣就設(shè)置好了縮略圖的頭信息,將其保存至縮略圖文件。
[0039]接下來就要修改像素采樣的地方了,以普通的GRG像素格式為例:首先添加一個函數(shù)skip_one_row,用來跳過行采樣的時候,那些不需要的行。該函數(shù)內(nèi)容jpeg_read_scanlines (cinfo, buffer, I)。然后設(shè)置行內(nèi)取點(diǎn)指針一跳的寬度(simpleSize*cinf0.0utput_components)。然后開始行內(nèi)取點(diǎn),首先將指針移動((simpleSize*cinf0.0utput_components) ?1)&(?(cinf0.0utput_components-l)),獲取到第一個像素點(diǎn),然后按照之前設(shè)置的一跳的寬度,來把后面的像素點(diǎn)都采集到,就獲取到了一行的數(shù)據(jù)。然后按照采樣率simpleSize - 1,通過skip_one_row函數(shù)忽略那些不需要采集的行。然后循環(huán)上面步驟后,就獲取到了縮略圖。
[0040]綜上所述,本發(fā)明通過用libjpeg, Iibpng解碼結(jié)合縮略圖提取方法,直接在打開并解碼圖片的過程中,完成縮略圖的生成,使整個過程無論是在Windows上,Linux上,android上,只需要很小的內(nèi)存空間,就可以每張縮略圖的生成。這樣就可以適配很多配置不是很好終端設(shè)備,例如手機(jī)、平板。并且在使用內(nèi)存很少的狀態(tài)下,可以使用多線程方式并行的讀取圖片,就會具有很高的效率,讓用戶在操作的時候,具有很好的用戶體驗。
【主權(quán)項】
1.圖像縮略圖生成方法,其特征在于,包括以下幾個步驟: 步驟1、系統(tǒng)讀取原圖像頭文件信息,結(jié)合縮略圖尺寸,生成縮略圖頭信息并將其存儲至縮略圖文件; 步驟2、系統(tǒng)獲取原圖像行寬度乘以單個像素點(diǎn)顏色值的寬度得到一個數(shù)值,然后按照這個數(shù)值在系統(tǒng)中申請內(nèi)存塊; 步驟3、系統(tǒng)根據(jù)原圖像頭文件信息及縮略圖尺寸然后計算出采樣率; 步驟4、系統(tǒng)根據(jù)采樣率計算出原圖像文件中待采樣行數(shù)及列數(shù),逐個將每一行數(shù)據(jù)存儲至內(nèi)存塊,并對其進(jìn)行像素采樣,并將采樣數(shù)據(jù)存儲至縮略圖文件;逐個將每一列數(shù)據(jù)存儲至內(nèi)存塊,并對其進(jìn)行像素采樣,并將采樣數(shù)據(jù)存儲至縮略圖文件; 步驟5、系統(tǒng)根據(jù)縮略圖文件生成縮略圖。2.根據(jù)權(quán)利要求1所述的圖像縮略圖生成方法,其特征在于,所述步驟I中,縮略圖頭信息至少包括縮略圖的寬度,高度、像素的字節(jié)數(shù)、像素寬度及調(diào)色板信息。3.根據(jù)權(quán)利要求1所述的圖像縮略圖生成方法,其特征在于,所述步驟I中,系統(tǒng)使用Iibpng或Iibjpeg讀取原圖像頭文件信息,其中Iibpng處理PNG格式圖片,Iibjpeg處理jpeg圖片。4.根據(jù)權(quán)利要求1所述的圖像縮略圖生成方法,其特征在于,所述步驟2中,內(nèi)存塊至少為一個。5.根據(jù)權(quán)利要求1所述的圖像縮略圖生成方法,其特征在于,所述步驟3中,采樣率包括行采樣率,所述行采樣率值為原圖像的行寬度除以縮略圖的行寬度然后取整得到。6.根據(jù)權(quán)利要求5所述的圖像縮略圖生成方法,其特征在于,所述步驟3中,采樣率包括列采樣率,列采樣率值為原圖像的列高度除以縮略圖的列高度然后取整得到。7.根據(jù)權(quán)利要求6所述的圖像縮略圖生成方法,其特征在于,所述步驟4中,系統(tǒng)以行采樣率值的一半取整數(shù)作為第一數(shù)值,并讀取原圖像文件中第一數(shù)值行數(shù)的數(shù)據(jù)作為第一行數(shù)據(jù)存儲至內(nèi)存塊,并對其進(jìn)行像素采樣,并將采樣數(shù)據(jù)存儲至縮略圖文件。8.根據(jù)權(quán)利要求7所述的圖像縮略圖生成方法,其特征在于,所述步驟4中,系統(tǒng)以列采樣率值的一半取整數(shù)作為第一數(shù)值,并讀取原圖像文件中第一數(shù)值列數(shù)的數(shù)據(jù)作為第一列數(shù)據(jù)存儲至內(nèi)存塊,并對其進(jìn)行像素采樣,并將采樣數(shù)據(jù)存儲至縮略圖文件。
【專利摘要】本發(fā)明涉及計算機(jī)圖片轉(zhuǎn)換技術(shù)。本發(fā)明提供一種圖像縮略圖生成方法,首先,系統(tǒng)讀取原圖像頭文件信息,結(jié)合縮略圖尺寸,生成縮略圖頭信息并將其存儲至縮略圖文件;其次,系統(tǒng)獲取原圖像行寬度乘以單個像素點(diǎn)顏色值的寬度得到一個數(shù)值,然后按照這個數(shù)值在系統(tǒng)中申請內(nèi)存塊;然后,系統(tǒng)根據(jù)原圖像頭文件信息及縮略圖尺寸然后計算出采樣率;再然后,系統(tǒng)根據(jù)采樣率計算出原圖像文件中待采樣行數(shù)及列數(shù),逐個將每一行數(shù)據(jù)存儲至內(nèi)存塊,并對其進(jìn)行像素采樣,并將采樣數(shù)據(jù)存儲至縮略圖文件;逐個將每一列數(shù)據(jù)存儲至內(nèi)存塊,并對其進(jìn)行像素采樣,并將采樣數(shù)據(jù)存儲至縮略圖文件;最后,系統(tǒng)根據(jù)縮略圖文件生成縮略圖。適用于縮略圖生成。
【IPC分類】G06T3/40, G06F3/0481
【公開號】CN105302415
【申請?zhí)枴緾N201510679039
【發(fā)明人】楊毅
【申請人】四川長虹電器股份有限公司
【公開日】2016年2月3日
【申請日】2015年10月19日