天天看點

My God,CImage裁剪圖檔變成黑色了

一直以來,用CImage裁剪圖檔,代碼如下:

CImage img;
if (FAILED(img.Load(strFileFrom)))
    return;

int imgH = img.GetHeight();
int imgW = img.GetWidth();
int bpp = img.GetBPP();

// 裁剪内部左上的1/4位置的一塊小圖
int x1 = imgW/4;
int y1 = imgH/4;
int w = x1;
int h = y1;

CImage imgDest;
imgDest.Create(w, h, bpp);
img.BitBlt(imgDest.GetDC(), 0, 0, w, h, x1, y1, SRCCOPY);
imgDest.Save(strNewFileName, Gdiplus::ImageFormatJPEG);
           

這個代碼一直工作正常,但是今天回報說裁出來的圖檔很多都是黑色的,我仔細檢視了一下,裁剪的位置沒有錯,原圖檔也正常,在img.Load()之後,可以正常顯示出來。

然後我再用裁出來的小圖imgDest顯示,發現是黑色的,仔細跟蹤裁剪的位置和尺寸,确實和預期的一樣,也沒有超出圖檔的尺寸。

再仔細檢視原圖檔的屬性,發現其是8位的,但是裁剪出來的圖檔看屬性,顯示是24位。然後去網上搜尋關于CImage對8位圖像處理的問題,原來需要設定調色闆,修改後的代碼如下(中間加了個調色闆的設定):

CImage img;
if (FAILED(img.Load(strFileFrom)))
    return;

int imgH = img.GetHeight();
int imgW = img.GetWidth();
int bpp = img.GetBPP();

// 裁剪内部左上的1/4位置的一塊小圖
int x1 = imgW/4;
int y1 = imgH/4;
int w = x1;
int h = y1;

CImage imgDest;
imgDest.Create(w, h, bpp);

if (bpp == 8)
{
	/*
	如果是8位,則必需使用調色闆,否則出來的圖像就是黑色的
	在拷貝圖像之前,要先設定調色闆,如果是先拷貝再設定,則沒有任何效果
    這裡不管它沒有深入研究,隻是直接按照256個值進行拷貝
	*/
	RGBQUAD colorTable[256];
	img.GetColorTable(0, 256, colorTable);
	imgDest.SetColorTable(0, 256, colorTable);
}

img.BitBlt(imgDest.GetDC(), 0, 0, w, h, x1, y1, SRCCOPY);
imgDest.Save(strNewFileName, Gdiplus::ImageFormatJPEG);
img.BitBlt(imgDest.GetDC(), 0, 0, w, h, x1, y1, SRCCOPY);
imgDest.Save(strNewFileName, Gdiplus::ImageFormatJPEG);
           

在加了調色闆之後,儲存的圖檔正常了

繼續閱讀