一直以來,用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);
在加了調色闆之後,儲存的圖檔正常了