L o a d i n g . . .
主打一个C++
文章详情

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

作者近期文章
  • 随手笔记
  • 主打一个C++   2025-01-11 20:02:01
  • 都2000000025年了。还有不能随意访问guthub的,仔细看。在国内其实是可以正常访问的,gfw并没屏蔽。这里给出其中一个简单直接的方法稳定访问。1. 随便百度一个”dn
提示
×
确定
数据库执行: 8次 总耗时: 0.01s
页面加载耗时: 



wechat +447752296473
wechat cpp-blog