下面第一个方法是在第二个方法的基础上优化来的,这里都贴出来供大家参考学习。
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 bitmap
if (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));
}
}
我测试的结果是,第一种方法速度要快一些。