image - 绘制两个位图差异的结果位图的问题
问题描述
我想将一个位图与另一个位图(参考位图)进行比较,并在结果位图中绘制它的所有差异。使用下面的代码,我只能绘制差异区域,但不能绘制它的确切颜色。
这是我的代码
Bitmap ResultantBitMap = new Bitmap(bitMap1.Height, bitMap2.Height);
BitmapData bitMap1Data = bitMap1.LockBits(new Rectangle(0, 0, bitMap1.Width, bitMap1.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
BitmapData bitMap2Data = bitMap2.LockBits(new Rectangle(0, 0, bitMap2.Width, bitMap2.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
BitmapData bitMapResultantData = ResultantBitMap.LockBits(new Rectangle(0, 0, ResultantBitMap.Width, ResultantBitMap.Height), System.Drawing.Imaging.ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
IntPtr scan0 = bitMap1Data.Scan0;
IntPtr scan02 = bitMap2Data.Scan0;
IntPtr scan0ResImg1 = bitMapResultantData.Scan0;
int bitMap1Stride = bitMap1Data.Stride;
int bitMap2Stride = bitMap2Data.Stride;
int ResultantImageStride = bitMapResultantData.Stride;
for (int y = 0; y < bitMap1.Height; y++)
{
//define the pointers inside the first loop for parallelizing
byte* p = (byte*)scan0.ToPointer();
p += y * bitMap1Stride;
byte* p2 = (byte*)scan02.ToPointer();
p2 += y * bitMap2Stride;
byte* pResImg1 = (byte*)scan0ResImg1.ToPointer();
pResImg1 += y * ResultantImageStride;
for (int x = 0; x < bitMap1.Width; x++)
{
//always get the complete pixel when differences are found
if (Math.Abs(p[0] - p2[0]) >= 20 || Math.Abs(p[1] - p2[1]) >= 20 || Math.Abs(p[2] - p2[2]) >= 20)
{
pResImg1[0] = p2[0];// B
pResImg1[1] = p2[1];//R
pResImg1[2] = p2[2];//G
pResImg1[3] = p2[3];//A (Opacity)
}
p += 4;
p2 += 4;
pResImg1 += 4;
}
}
bitMap1.UnlockBits(bitMap1Data);
bitMap2.UnlockBits(bitMap2Data);
ResultantBitMap.UnlockBits(bitMapResultantData);
ResultantBitMap.Save(@"c:\\abcd\abcd.jpeg");
我想要的是具有参考图像精确颜色的差异图像。
解决方案
如果不知道所有这些库调用和“+= 4”是什么,很难说出发生了什么,但是,您确定 p 和 p2 对应于图表的第一张和第二张图像吗?
此外,您的“Format32bppArgb”格式表明 [0] 对应于 alpha,而不是红色。也许这也有问题。
推荐阅读
- printing - 如何打印我指示的点之间的距离?
- python - 如何在创建对象时增加父类中的静态计数器
- excel - 如果它们包含关键字,如何将行从一个工作表移动到另一个工作表
- node.js - 将 OKTA 集成到现有的 AD 应用程序中 - NodeJS ExpressOIDC
- c - C 中的队列和动态分配结构的问题
- javascript - 如何根据.cshtml中的不同下拉值显示不同的表格?
- php - 在 woocommerce 中执行自定义订单操作后出现“白屏”
- three.js - Raycast 在鼠标点击时未检测到导入的 fbx
- jenkins - 由于 .svn 文件夹,Jenkins 作业因“mlDeployApp”任务而失败
- python - 有没有一种更有效的方法来查找列表的最小值/最大值/总和,而无需创建另一个变量来查找总和