文章详情
CImage类取出png图像中不相同的内容作为新图储存
Posted on 2019-04-15 08:07:43 by 主打一个C++
方法1:
#include <atlimage.h>
#include <atlbase.h>
#include <vector>
#include <algorithm>
void ExtractDifference(const CImage& img1, const CImage& img2, CImage& diffImg) {
// 确保两个图像的尺寸相同
if (img1.GetWidth() != img2.GetWidth() || img1.GetHeight() != img2.GetHeight()) {
throw std::invalid_argument("两个图像的尺寸必须相同");
}
// 创建一个新的图像对象来存储差异
diffImg.Create(img1.GetWidth(), img1.GetHeight(), 32); // 32位ARGB格式
// 获取图像的宽度和高度
int width = img1.GetWidth();
int height = img1.GetHeight();
// 遍历每个像素
for (int y = 0; y < height; ++y) {
for (int x = 0; x < width; ++x) {
// 获取两个图像在当前像素位置的颜色
COLORREF color1 = img1.GetPixel(x, y);
COLORREF color2 = img2.GetPixel(x, y);
// 检查颜色是否不同
if (color1 != color2) {
// 如果颜色不同,将该颜色设置到新的差异图像中
diffImg.SetPixel(x, y, color1);
}
else {
// 如果颜色相同,将差异图像的该像素设置为透明
diffImg.SetPixel(x, y, RGB(0, 0, 0)); // 或者你可以选择设置为其他颜色,比如白色RGB(255, 255, 255)
}
}
}
}
int main(){
//调用实例
CImage img1, img2, diffImg;
img1.Load(L"image1.png");
img2.Load(L"image2.png");
ExtractDifference(img1, img2, diffImg);
diffImg.Save(L"diff_image.png", Gdiplus::ImageFormatPNG);
}
//这种方法的缺点:速度极慢
方法2:直接对内存操作
void ExtractDifference(const CImage& img1, const CImage& img2, CImage& diffImg) {
// 确保两个图像的尺寸相同
if (img1.GetWidth() != img2.GetWidth() || img1.GetHeight() != img2.GetHeight()) {
throw std::invalid_argument("两个图像的尺寸必须相同");
}
// 创建一个新的图像对象来存储差异,使用32位ARGB格式
diffImg.Create(img1.GetWidth(), img1.GetHeight(), 32);
// 获取图像的宽度和高度
int width = img1.GetWidth();
int height = img1.GetHeight();
// 获取图像的位图数据
BYTE* pBits1 = (BYTE*)img1.GetBits();
BYTE* pBits2 = (BYTE*)img2.GetBits();
BYTE* pBitsDiff = (BYTE*)diffImg.GetBits();
// 计算每行的字节数
int pitch = img1.GetPitch();
// 遍历每个像素
for (int y = 0; y < height; ++y) {
for (int x = 0; x < width; ++x) {
// 获取两个图像在当前像素位置的颜色分量
int index = y * pitch + x * 4; // 每个像素4个字节(ARGB)
BYTE a1 = pBits1[index + 3];
BYTE r1 = pBits1[index + 2];
BYTE g1 = pBits1[index + 1];
BYTE b1 = pBits1[index];
BYTE a2 = pBits2[index + 3];
BYTE r2 = pBits2[index + 2];
BYTE g2 = pBits2[index + 1];
BYTE b2 = pBits2[index];
// 检查颜色是否不同
if (r1 != r2 || g1 != g2 || b1 != b2) {
// 如果颜色不同,将该颜色设置到新的差异图像中
pBitsDiff[index + 3] = a1; // Alpha
pBitsDiff[index + 2] = r1; // Red
pBitsDiff[index + 1] = g1; // Green
pBitsDiff[index] = b1; // Blue
}
else {
// 如果颜色相同,将差异图像的该像素设置为透明
pBitsDiff[index + 3] = 0; // Alpha
pBitsDiff[index + 2] = 0; // Red
pBitsDiff[index + 1] = 0; // Green
pBitsDiff[index] = 0; // Blue
}
}
}
}
//这种方法速度正常,满足一般需求
*转载请注明出处:原文链接:https://cpp.vin/page/105.html