cerco di caricare il file JPEG e cancellare tutti i pixel in bianco e nero da un'immagine.NET metodo Bitmap.Load produrre risultato diverso su computer diversi
C# Codice:
...
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));
}
}
...
Dopo che cerco di trovare colori univoci nell'elenco di questo codice
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);
E questo codice produce risultati diversi su macchine diverse sulla stessa immagine!
Per esempio, su this image Produce:
colori- 43198 unici su XP SP3 con la versione .NET 4
- 43168 colori unici su Win7 Ultimate con la versione .NET 4,5
minima progetto di prova è possibile download here. Apre solo l'immagine selezionata e produce file txt con colori unici.
Un altro fatto. Alcuni pixel vengono letti in modo diverso su macchine diverse. Confronto i file txt con Notepad ++ e mostra che alcuni pixel hanno componenti RGB differenti. La differenza è 1 per ciascun componente, ad es.
- Win7 pixel: 255 200 100
- WinXP pixel: 254 199 99
Ho letto questo post
stackoverflow.com/questions/2419598/why-might-different- calcolatori-calcoli-diversi-aritmetici-risultati-in-vb-net
(mi dispiace, non ho abbastanza rastrellamento per il collegamento normale).
... ma non c'erano informazioni su come risolverlo.
Il progetto è stato compilato per .NET 4 Profilo client su macchina con sistema operativo Windows 7 in VS 2015 Commumity Edition.
Per caricare immagini, è necessario scegliere un servizio di caricamento gratuito che non richieda il login – TaW
@TaW Spostare l'immagine su imgur.com e spostare il progetto di test su github –
Grazie. Comunque credo che la risposta di Lasse sia corretta: JPeg non è pensato per riprodurre l'immagine con assoluta precisione. Passa al PNG se ne hai davvero bisogno! – TaW