CImage拷贝到另一个CImage,两个方法
下面第一个方法是在第二个方法的基础上优化来的,这里都贴出来供大家参考学习。
void CopyImg(const CImage& src, CImage& dst)
{if (src.IsNull())return;//源图像参数BYTE* srcPtr = (BYTE*)src.GetBits();int srcBitsCount = src.GetBPP();int srcWidth = src.GetWidth();int srcHeight = src.GetHeight();int srcPitch = src.GetPitch();//销毁原有图像if (!dst.IsNull()){dst.Destroy();}//创建新图像if (srcBitsCount == 32) //支持alpha通道{dst.Create(srcWidth, srcHeight, srcBitsCount, 1);}else{dst.Create(srcWidth, srcHeight, srcBitsCount, 0);}//加载调色板, for 8 bit bitmapif (srcBitsCount <= 8 && src.IsIndexed())//需要调色板{RGBQUAD pal[256];int nColors = src.GetMaxColorTableEntries();if (nColors > 0){src.GetColorTable(0, nColors, pal);dst.SetColorTable(0, nColors, pal);//复制调色板程序}}//目标图像参数BYTE *destPtr = (BYTE*)dst.GetBits();int destPitch = dst.GetPitch();// the new codes by sund if (srcPitch < 0) {memcpy(destPtr + destPitch*(srcHeight - 1), srcPtr + srcPitch*(srcHeight - 1), srcHeight*abs(srcPitch));}else {memcpy(destPtr, srcPtr, srcHeight*abs(srcPitch));}return;
}
void CopyImage(const CImage& srcImage, CImage& destImage)
{if (srcImage.IsNull())return;BYTE* srcPtr = (BYTE*)srcImage.GetBits();int srcBitsCount = srcImage.GetBPP();int srcWidth = srcImage.GetWidth();int srcHeight = srcImage.GetHeight();int srcPitch = srcImage.GetPitch();if (!destImage.IsNull()){destImage.Destroy();}if (srcBitsCount == 32){destImage.Create(srcWidth, srcHeight, srcBitsCount, 1);}else{destImage.Create(srcWidth, srcHeight, srcBitsCount, 0);}if (srcBitsCount <= 8 && srcImage.IsIndexed()){RGBQUAD pal[256];int nColors = srcImage.GetMaxColorTableEntries();if (nColors > 0){srcImage.GetColorTable(0, nColors, pal);destImage.SetColorTable(0, nColors, pal);}}BYTE *destPtr = (BYTE*)destImage.GetBits();int destPitch = destImage.GetPitch();for (int i = 0; i < srcHeight; i++){memcpy(destPtr + i*destPitch, srcPtr + i*srcPitch, abs(srcPitch));}
}
我测试的结果是,第一种方法速度要快一些。