我嘗試加載JPEG文件,並從圖像中刪除所有的黑色和白色像素.NET Bitmap.Load方法產生不同的計算機上不同的結果
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));
}
}
...
之後,我試圖找到此代碼列表中的唯一顏色
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);
而且此代碼在同一圖像上的不同機器上產生不同的結果!
例如,在this image它產生:
- 43198獨特的顏色上XP SP3與.NET版本上的Win7終極4
- 43168種獨特的顏色與.NET版本4.5
最小測試項目你可以download here。它只是打開選定的圖像,併產生獨特的顏色txt文件。
還有一個事實。一些像素在不同的機器上讀取不同。我將txt文件與記事本++進行了比較,它顯示了一些像素具有不同的RGB分量。每個組件的差別是1,例如,
- Win7的像素:255 200 100
- WinXP的像素:254 199 99
我已經閱讀這個交
stackoverflow.com/questions/2419598/why-might-different- (對不起,我沒有足夠的正常鏈接)。
...但沒有信息如何解決它。
在VS 2015 Commumity Edition中針對OS Windows 7的計算機上的.NET 4客戶端配置文件進行了編譯。
要上傳圖片,您應該選擇免費上傳服務,不需要我們登錄 – TaW
@TaW將圖片移動到imgur.com並將測試項目移動到github –
謝謝。不過我猜Lasse的答案是正確的:JPeg並不意味着以絕對準確的方式再現圖像。如果你真的需要這個,請轉到PNG! – TaW