- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用 GetPixel 和 SetPixel 很简单,但速度很慢,所以我尝试使用 LockBits。
我很久以前就用过这种方法来比较两张图片:
public static Bitmap FastComparison(Bitmap bmp1,Bitmap bmp2)
{
tolerancenumeric = 15;
int tolerance = tolerancenumeric * tolerancenumeric +
tolerancenumeric * tolerancenumeric +
tolerancenumeric * tolerancenumeric; //dr * dr + dg * dg + db * db;
bmp3 = new Bitmap(512,512);
PixelFormat pxf = PixelFormat.Format24bppRgb;
Rectangle rect = new Rectangle(0, 0, bmp1.Width, bmp1.Height);
BitmapData bmpData1 = bmp1.LockBits(rect, ImageLockMode.ReadWrite, pxf);
BitmapData bmpData2 = bmp2.LockBits(rect, ImageLockMode.ReadWrite, pxf);
BitmapData bmpData3 = bmp3.LockBits(rect, ImageLockMode.ReadWrite, pxf);
IntPtr ptr1 = bmpData1.Scan0;
IntPtr ptr2 = bmpData2.Scan0;
IntPtr ptr3 = bmpData3.Scan0;
int numBytes = bmpData1.Stride * bmp1.Height;
byte[] rgbValues1 = new byte[numBytes];
Marshal.Copy(ptr1, rgbValues1, 0, numBytes);
bmp1.UnlockBits(bmpData1);
byte[] rgbValues2 = new byte[numBytes];
Marshal.Copy(ptr2, rgbValues2, 0, numBytes);
bmp2.UnlockBits(bmpData2);
for (int counter = 0; counter < rgbValues1.Length; counter += 3)
{
int dr, dg, db;
dr = (int)rgbValues2[counter] - (int)rgbValues1[counter];
dg = (int)rgbValues2[counter + 1] - (int)rgbValues1[counter + 1];
db = (int)rgbValues2[counter + 2] - (int)rgbValues1[counter + 2];
int error = dr * dr + dg * dg + db * db;
int y, x;
y = (counter / 3) / 512;
x = (counter - y * 512 * 3)/3;
if ((x == 479) && (y == 474))
{
Byte r1, g1, b1, r2, g2, b2;
r1 = rgbValues1[counter];
b1 = rgbValues1[counter+1];
g1 = rgbValues1[counter+2];
r2 = rgbValues2[counter];
b2 = rgbValues2[counter+1];
g2 = rgbValues2[counter+2];
}
if (error < tolerance)
{
rgbValues1[counter] = 0;
rgbValues1[counter + 1] = 0;
rgbValues1[counter + 2] = 0;
}
}
Marshal.Copy(rgbValues1, 0, ptr3, numBytes);
bmp3.UnlockBits(bmpData3);
return bmp3;
}
但现在我也想使用 LockBits,但使用一张图像并将所有非黑色的像素着色为黄色。
我开始了新的方法:
public Bitmap ChangeColors(Bitmap bmp1)
{
bmpColors = new Bitmap(512, 512);
PixelFormat pxf = PixelFormat.Format24bppRgb;
Rectangle rect = new Rectangle(0, 0, bmp1.Width, bmp1.Height);
BitmapData bmpData1 = bmp1.LockBits(rect, ImageLockMode.ReadWrite, pxf);
IntPtr ptr1 = bmpData1.Scan0;
int numBytes = bmpData1.Stride * bmp1.Height;
byte[] rgbValues1 = new byte[numBytes];
Marshal.Copy(ptr1, rgbValues1, 0, numBytes);
bmp1.UnlockBits(bmpData1);
for (int counter = 0; counter < rgbValues1.Length; counter += 3)
{
int y, x;
y = (counter / 3) / 512;
x = (counter - y * 512 * 3) / 3;
Byte r1, g1, b1;
r1 = rgbValues1[counter];
b1 = rgbValues1[counter + 1];
g1 = rgbValues1[counter + 2];
}
return bmpColors;
}
但不确定如何使位图 bmpColors 成为原始位图,但所有像素都不是黑色的黄色。
最佳答案
简单地测试字节并相应地设置它们怎么样?
Byte r1, g1, b1;
r1 = rgbValues1[counter]; // should be + 2 !!
b1 = rgbValues1[counter + 1]; // should be + 0 !!
g1 = rgbValues1[counter + 2]; // should be + 1 !!
if (r1 + b1 + g1 == 0 )
{
r1 = 255;
g1 = 255;
}
当然,这假设您可以接受纯黑色和基本黄色。
如果你需要更多的控制,你需要更多的代码,比如
if (r1 + b1 + g1 < threshold)
对于黑色阴影,对于黄色可能:
r1 = myYellow_R;
g1 = myYellow_G;
b1 = myYellow_B;
顺便说一句:您需要检查那些索引;上次我查看 LockBits 数组中的数据是反转的:不是RGB
,(更不用说你拥有的RBG
了)但是BGR
! (对于 32bpp BGRA
!)
由于您使用的是旧方法,请同时确保您的像素格式没有问题;如果它是 32bpp
,您需要进行一些简单的修改。
关于c# - 如何使用 LockBits 将位图中非黑色的像素着色为黄色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25976620/
北京时间今天下午,realme 5i手机正式登陆印度市场,5000mAh+骁龙665处理器,售价约合人民币870元。在发布会上,realme的印度CEO马达夫·希思(Madhav Sh
这个问题在这里已经有了答案: What does a space mean in a CSS selector? i.e. What is the difference between .clas
我配置了 Jenkins 构建(项目使用 Java、Maven、JUnit)。根据单元测试失败的 Maven 阶段,我想将构建标记为红色、黄色或绿色: 编译错误:红色 Maven 阶段“测试”失败:红
我想知道是否可以在“solidGauge”图表的右侧设置一个从左侧绿色(0 值)开始、中间渐变为黄色然后渐变为红色的渐变。 我在 yAxis 中尝试了一些配置,但它们没有按照我的要求进行:
我正在使用 cocos2d 库制作 iOS 游戏。 假设您有两个具有两种不同颜色的对象 - 在 RGB 中定义为 Blue: 0,0,255 Yellow: 255,255,0 我想添加蓝色和
有没有办法轻松地将给定的十六进制颜色代码分配给更一般的类别(红色、绿色、蓝色、黄色、橙色、粉色、黑色、白色、灰色……)? 比如 #ffcc55 -> 橙色,#f0f0f0 -> 白色,... 编辑:甚
我必须区分5种类型的图像,这些图像可能主要是红色,绿色,蓝色,橙色或黄色,而白色或黑色。我必须找到图像中突出的颜色。 图像来源是网络摄像头,因此实际颜色还取决于图像的照明度和距网络摄像头的距离。我的图
我一直在寻找如何在 qtableview 的特定单元格上设置颜色。目前,我正在使用 qt 示例卡住列来查看如何在特定单元格上设置颜色。 我在论坛上搜索有关如何告诉使用 qitemdelegate 或
我是一名优秀的程序员,十分优秀!