近日在使用iimage组件绘制图片时发现组件接口可能分别处理了PNG图形的24位位深和平32位位深的图。
代码片断:
// strFileName是外部文件路径,ppimage是iimage指针的指针
m_pImgFactory->CreateImageFromFile((const WCHAR*)strFileName.c_str(), ppImage))
ImageInfo imageInfo;
(void)pImage->GetImageInfo(&imageInfo);
//根据每英寸的点数来计算每毫米的点数
double dDotPermmX = imageInfo.Xdpi/25.4;
double dDotPermmY = imageInfo.Ydpi/25.4;
//pSrcRect指向以像素点为单位的区域
//计算已知图形的.01数毫米数
RECT rcTemp = {(LONG)((rcSrc->left/dDotPermmX)/0.01),
(LONG)((rcSrc->top/dDotPermmY)/0.01),
(LONG)((rcSrc->right/dDotPermmX)/0.01),
(LONG)((rcSrc->bottom/dDotPermmY)/0.01)};
//这里rcDst表示将要画上的区域,这个区域和目标DC有关,rcTemp是源图形的区域信息。
HRESULT hr = pImage->Draw(hdc, rcDst, &rcTemp);
上述代码使用IImage组件加载一张图,并显示。问题在于当rcTemp不为空时,即试图从Iimage切出部分图形显示在目标DC的区域上时。PNG图形的24位和32位切出的部位不一样。32位的切出是正序的,即(0,0)位在源图的左上角,而24位切出的是倒序的,(0,0)在源图的左下角。可能因为24位是逆序的。