C # - Come convertire un immagine in un colore di un'immagine a 8 bit?
-
21-09-2019 - |
Domanda
Ho bisogno di convertire un PNG Immagine caricato da un file in un bit-per-pixel array di 8 byte utilizzato da un altro dispositivo (programmazione embedded).
Sono la copia su pixel per pixel in una nuova immagine creata con un colore a 16 bit - Format16bppRgb565
, ma ho bisogno Format8bpp
, che non è presente in .NET Framework. (Non posso usare Format8bppIndexed
poiché l'altro dispositivo non supporta bitmap indicizzati)
Bitmap img = new Bitmap(imgPath);
Bitmap img8 = new Bitmap(imgW, imgH, PixelFormat.Format16bppRgb565);
for (int I = 0; I <= img.Width - 1; I++) {
for (int J = 0; J <= img.Height - 1; J++) {
img8.SetPixel(I, J, img.GetPixel(I, J));
}
}
Quindi, come posso convertire un'immagine in un 8-bit per matrice di pixel di byte?
- Posso utilizzare il formato indicizzato a 8 bit ed estrarre i byte? -
Format8bppIndexed
- Posso calcolare i colori dei pixel riducendo il colore R a 32 bit, G, B i valori a 8-bit?
- C'è una libreria C # che fa questo già?
- "Il modo più semplice è quello di creare un nuovo 8 bit bitmap e disegnare l'immagine a 24 bit su di esso." -? Come
Soluzione
Anche se non sono sicuro di come farlo con plain vanilla C # è possibile utilizzare il FreeImage Progetto librerie per convertire le immagini formati:
FreeImage è una libreria open source progetto per gli sviluppatori che desiderano per contribuire all'immagine grafica popolare formati come PNG, BMP, JPEG, TIFF e gli altri in base alle esigenze multimediali di oggi applicazioni. FreeImage è facile usare, veloce, sicura multithreading, compatibile con tutte le versioni a 32 bit di Windows e multipiattaforma (funziona sia con Linux e Mac OS X).
E 'scritto in C ++, ma ha buone wrapper NET è possibile utilizzare.
Altri suggerimenti
L'ho già fatto in un unico progetto di pattern recognition. Cercando alcuni libri di elaborazione delle immagini e pattern recognition si possono trovare queste soluzioni.
a) Se si desidera convertire in scala di grigi si può trovare in due soluzioni generali.
# 1 Una media di canali RGB. - Si può prendere valori a 8 bit per Avery singolo canale e calcolare pixel = (R + G + B) / 3
# 2 Prendere solo la componente verde. E si vede meglio.
b) Se si desidera convertire in rappresentazione dei colori a 8 bit è necessario utilizzare una tabella di colori. Si può vedere una soluzione qui http://www.codeproject.com/KB/graphics/Image_Bitdepth_Conversion aspx