CImage拷贝到另一个CImage,两个方法

4 篇文章 0 订阅

下面第一个方法是在第二个方法的基础上优化来的,这里都贴出来供大家参考学习。

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));
	}
}

我测试的结果是,第一种方法速度要快一些。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值