Pav*_*.Zh 5 .net c# windows bitmap
我尝试加载JPEG文件并从图像中删除所有黑白像素
C#代码:
...
m_SrcImage = new Bitmap(imagePath);
Rectangle r = new Rectangle(0, 0, m_SrcImage.Width, m_SrcImage.Height);
BitmapData bd = m_SrcImage.LockBits(r, ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
//Load Colors
int[] colours = new int[m_SrcImage.Width * m_SrcImage.Height];
Marshal.Copy(bd.Scan0, colours, 0, colours.Length);
m_SrcImage.UnlockBits(bd);
int len = colours.Length;
List<Color> result = new List<Color>(len);
for (int i = 0; i < len; ++i)
{
uint w = ((uint)colours[i]) & 0x00FFFFFF; //Delete alpha-channel
if (w != 0x00000000 && w != 0x00FFFFFF) //Check pixel is not black or white
{
w |= 0xFF000000; //Return alpha channel
result.Add(Color.FromArgb((int)w));
}
}
...
Run Code Online (Sandbox Code Playgroud)
之后,我尝试通过此代码在List中找到唯一的颜色
result.Sort((a, b) =>
{
return a.R != b.R ? a.R - b.R :
a.G != b.G ? a.G - b.G :
a.B != b.B ? a.B - b.B :
0;
});
List<Color> uniqueColors = new List<Color>( result.Count);
Color rgbTemp = result[0];
for (int i = 0; i < len; ++i)
{
if (rgbTemp == result[i])
{
continue;
}
uniqueColors.Add(rgbTemp);
rgbTemp = result[i];
}
uniqueColors.Add(rgbTemp);
Run Code Online (Sandbox Code Playgroud)
此代码在同一图像上的不同机器上产生不同的结果!
例如,在此图像上它产生:
您可以在此处下载最低测试项目.它只是打开选定的图像并生成具有独特颜色的txt文件.
还有一个事实.在不同的机器上读取一些像素的方式不同 我将txt文件与notepad ++进行比较,它显示某些像素具有不同的RGB组件.每个组件的差异为1,例如
我看过这篇文章
stackoverflow.com/questions/2419598/why-might-different-computers-calculate-different-arithmetic-results-in-vb-net
(对不起,我没有足够的raiting正常链接).
...但是没有信息如何解决它.
在VS 2015 Commumity Edition中使用OS Windows 7的机器上编译了.NET 4 Client profile的项目.