CImage的构造问题

独行~背包客 2019-02-14 10:52:52

CImage image1;
image1.Load(picpath);
CImage image2 = image1;


这之后对image2的像素颜色进行改变,发现image1的像素颜色也随之变化,不清楚为什么?
谢谢!
...全文
435 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zgl7903 2019-02-15
  • 打赏
  • 举报
回复
引用 5 楼 远水孤云 的回复:
CImage如果要重写“=”,进行深拷贝,那么代码该如何实现?


可参考下 Atlimage.h 中 的 Load 和 CreateFromGdiplusBitmap的实现代码


独行~背包客 2019-02-15
  • 打赏
  • 举报
回复
CImage如果要重写“=”,进行深拷贝,那么代码该如何实现?
xiaoma_602 2019-02-14
  • 打赏
  • 举报
回复
CImage image2 = image1; 这句话就是实现了浅拷贝,没有拷贝对应的图像数据,导致图像内容相同。可以直接查看CImage的源码实现。
schlafenhamster 2019-02-14
  • 打赏
  • 举报
回复
"这里的等于相当与浅拷贝,所以两个对象的地址的相同" 对
独行~背包客 2019-02-14
  • 打赏
  • 举报
回复

bool CGraphDlg::ImageCopy(const CImage &srcImage, CImage &destImage)
{
int i, j;//循环变量
if (srcImage.IsNull())
return FALSE;
//源图像参数
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) //支持alpha通道
{
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 (i = 0; i < srcHeight; i++)
{
memcpy(destPtr + i * destPitch, srcPtr + i * srcPitch, abs(srcPitch));
}
return TRUE;
}

用上面函数也可以实现CImage的拷贝
目前就是不明白一开始提出的问题?
这里的等于相当与浅拷贝,所以两个对象的地址的相同?
zgl7903 2019-02-14
  • 打赏
  • 举报
回复
用 Image::Clone

VOID Example_Clone(HDC hdc)
{
Graphics graphics(hdc);

// Create an Image object, and then clone it.
Image image1(L"Crayons.jpg");
Image* pImage2 = image1.Clone();

// Draw the original image and the cloned image.
graphics.DrawImage(&image1, 20, 20);
graphics.DrawImage(pImage2, 250, 20);

delete pImage2;
}


15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧