próbuję załadować plik JPEG i usunąć wszystkie czarne i białe piksele z obrazuNET Bitmap.Load metoda produkować inny wynik na różnych komputerach
C# Kod:
...
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));
}
}
...
Potem staram się znaleźć unikalne kolory na liście według tego kodu
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);
Ten kod daje różne wyniki na różnych maszynach na tym samym obrazie!
Na przykład this image produkuje:
- 43.198 unikalnych kolorów na XP SP3 w wersji .NET 4
- 43168 unikalnych kolorów na Win7 Ostatecznego z wersji NET 4,5
Minimalna projekt testowy można download here. Po prostu otwiera wybrany obraz i tworzy plik txt z unikalnymi kolorami.
Jeszcze jeden fakt. Niektóre piksele są odczytywane różnie na różnych komputerach. Porównuję pliki txt z notatnikiem ++ i pokazuje, że niektóre piksele mają różne komponenty RGB. Różnica wynosi 1 dla każdego składnika, np.
- Win7 pikseli: 255 200 100
- WinXP pikseli: 254 199 99
mam przeczytać ten post
stackoverflow.com/questions/2419598/why-might-different- komputery-oblicz-różne-arytmetyczne-wyniki-in-vb-net
(przepraszam, nie mam wystarczająco dużo raiting dla normalnego łącza).
... ale nie było informacji, jak to naprawić.
Projekt został skompilowany dla .NET 4 Client Profile na komputerze z systemem OS Windows 7 w VS 2015 Commumity Edition.
Aby przesłać obrazy, należy wybrać usługę bezpłatnego przesyłania, która nie wymaga logowania się. – TaW
@TaW Przenieś zdjęcie na imgur.com i przenieś projekt testowy na github –
Dzięki. Jednak myślę, że odpowiedź Lasse jest poprawna: JPeg nie ma na celu reprodukcji obrazu z absolutną dokładnością. Ruszaj do PNG, jeśli naprawdę tego potrzebujesz! – TaW