2015-05-22 12 views
13

In C# Posso dichiarare nuovo 48bitRGB o senza problemi e in effetti il ​​formato corretto viene salvato su disco.dichiarazione colore colore a 64 bit (16 bit per canale)

Tuttavia, quando si tratta di dichiarare un colore, io non sono in grado di dichiarare il colore dei valori superiore a 8-bit. Ciò sembra essere dovuto al fatto che le dichiarazioni Color non richiedono più di 8 bit per componente.

Il codice che ho finora:

int x; 
int y; 
int w = 512, h = 512; 

Bitmap image = new Bitmap(w, h, System.Drawing.Imaging.PixelFormat.Format48bppRgb); //New image with 16bit per channel, no problem 

// Double 'for' control structure to go pixel by pixel on the whole image 
for (y = 0; y < h; y++) 
{ 
    for (x = 0; x < w; x++) 
    { 
     comp = somevalue; //Numeric component value 
     // Lo que vaya por aqui 
     System.Drawing.Color newColor = System.Drawing.Color.FromArgb(255, comp, comp, comp); // <= Here is the problem, values can't exceed 256 levels 
     image.SetPixel(x, y, newColor); 
    } 
} 

image.Save(@"C:\test.png", System.Drawing.Imaging.ImageFormat.Png); //Saving image to disk 

Che è un metodo per la dichiarazione di un componente di colore a 16 bit in C#?

+2

è possibile accedere ai pixel non elaborati, vedere qui come: http://stackoverflow.com/questions/7768711/setpixel-is-too-slow-is-there-a-faster-way-to-draw-to- bitmap – thumbmunkeys

+1

System.Drawing.Color utilizza internamente un lungo (numero intero a 64 bit con segno) per rappresentare il suo valore RGBA ma tutte le sue operazioni accettano valori, è necessario creare la propria classe Bitmap o utilizzare una libreria di formato grafico equivalente. – Machinarius

+0

stai usando wpf? – thumbmunkeys

risposta

3

Il problema deriva dal fatto che la classe bitmap incapsula un GDI + bimap.

GDI + versione 1.0 e 1.1 possono leggere immagini a 16 bit per canale, ma tali immagini vengono convertite in un formato a 8 bit per canale per l'elaborazione, la visualizzazione e il salvataggio. link

Quindi quando si imposta il valore dei pixel si ha a che fare con il formato 8 bit per canale.

Se si utilizza un codice non sicuro, è possibile accedere direttamente ai valori, vedere Get 64bpp image color.

+1

Stavo cercando di evitare l'accesso diretto, ma sembra che non ci sia un modo migliore. Grazie mille! –

+0

È possibile evitare il codice non sicuro copiando l'intero backing array (o parti di esso, a seconda dell'operazione) dall'immagine, e di nuovo dopo l'elaborazione, utilizzando 'Marshal.Copy'. – Nyerguds