Domanda

Sto caricando una bitmap da un file jpg.Se l'immagine non è RGB a 24 bit, vorrei convertirla.La conversione dovrebbe essere abbastanza veloce.Le immagini che sto caricando sono enormi (9000*9000 pixel con una dimensione compressa di 40-50 MB).Come si può fare?

A proposito:Non voglio utilizzare librerie esterne, se possibile.Ma se conosci una classe di utilità open source che esegue le attività di imaging più comuni, sarei felice di saperlo.Grazie in anticipo.

È stato utile?

Soluzione

Il jpeg dovrebbe iniziare con 0xFF 0xd8. Dopo che troverete vari campi nel formato:

  1. identificatore campo 2 byte
  2. la lunghezza campo, escludendo identificatore campo. 2 byte.
  3. I dati variabili.

analizzare attraverso i campi. L'identificatore verrà cercando è 0xFF 0xC0. Questo è chiamato SOF0, e contiene altezza, larghezza, profondità di bit, ecc 0xFF 0xC0 sarà seguita da due byte per la lunghezza del campo. Immediatamente dopo che sarà un singolo byte che mostra la profondità di bit, che di solito tramite 8. Quindi ci saranno due byte per altezza, due per la larghezza, e un singolo byte per il numero di componenti; questo di solito è 1 (per scala di grigi) o 3. (per il colore)

Altri suggerimenti

Non è qualcosa che ho provato personalmente, ma penso che potresti aver bisogno di accedere alle informazioni EXIF ​​​​dell'immagine per iniziare.

Dai un'occhiata al post sul blog di Scott Hanselman sull'accesso alle informazioni EXIF ​​dalle immagini.

standard .NET System.Drawing namespace dovrebbe avere tutto il necessario, ma probabilmente non sarà molto efficace. Sarà caricare il tutto in RAM, decomprimerlo, convertirlo (probabilmente facendo una copia) e poi ri-comprimere e salvarlo. Se si mira per alte prestazioni, temo si potrebbe aver bisogno di guardare in librerie C / C ++ e fare involucri .NET per loro.

Per quanto ne so jpg è sempre 24 bpp. L'unica cosa che potrebbe cambiare sarebbe che si tratta di CMY (K?) Piuttosto che RGB. Tali informazioni sarebbero memorizzate nell'intestazione. Purtroppo non ho alcun mezzo di creazione di un'immagine CMYK per verificare se si carica in un bitmap convertirà automaticamente.

La seguente linea leggerà il file nella memoria:

Bitmap image = Image.FromFile(fileName);

image.PixelFormat vi dirà il formato di immagine. Tuttavia, non posso provare quello che il carico del file fa con i file diversi da jpgs 24bpp RGB. Posso solo raccomandare che di provarlo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top