2009-07-02 10 views
14

Ho una fotocamera digitale cannone e l'ho impostato per scattare foto con qualità superfine e genera un file .jpg di 3 mega. Se carico come questo in ASP.NET (questo è utile per cambiare è dpi di risoluzione o ritagliare o whaterver). NET Salvataggio jpeg con la stessa qualità come è stato caricato

imgPicture = Image.FromFile(Config.WorkDirectory + this.TempPhotoName); 
bmpPicture = new Bitmap(imgPicture); 

e poi salvarlo di nuovo in questo modo:

bmpModified.Save(Config.WorkDirectory + this.TempPhotoName,System.Drawing.Imaging.ImageFormat.Jpeg); 

esso emette un jpg di dimensioni pari a solo 700 KB. C'è una perdita di qualità.

Ho anche provato il risparmio in questo modo:

bmpPicture.Save(Config.WorkDirectory + this.TempPhotoName, codecJpeg, encparams); 

dove codecJpeg è

ImageCodecInfo codecJpeg = this.getEncoderInfo("image/jpeg"); 


    private ImageCodecInfo getEncoderInfo(string mimeType) 
    { 
     // Get image codecs for all image formats 
     ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders(); 

     // Find the correct image codec 
     for (int i = 0; i < codecs.Length; i++) 
      if (codecs[i].MimeType == mimeType) 
       return codecs[i]; 
     return null; 
    } 

e encparams:

EncoderParameters encparams = new EncoderParameters(1); 
encparams.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 97L); 

In questo modo la dimensione (e ho il sospetto anche la qualità) viene mantenuto, ma sto inserendo la qualità a mano.

voglio chiedere:

C'è un modo per salvare l'immagine con la stessa qualità come è stato caricato senza hardcoding il valore di qualità?

Grazie in anticipo

risposta

5

Così suona come si sa come impostare la qualità, è davvero solo bisogno di sapere come recuperare la qualità dall'immagine originale?

Ho il sospetto che Image.PropertyItems sia tuo amico, se la qualità è nei metadati per iniziare. (Non so se c'è anche una scala standard per la qualità all'interno degli encoder JPEG.)

EDIT: Ho appena controllato, e un jpeg che ho scaricato non aveva tag per la qualità.

Un'opzione potrebbe essere quella di calcolare l'entità del file che dovrebbe avere all'incirca la stessa qualità, quindi salvarlo più volte, eseguendo una ricerca binaria per ottenere la qualità più appropriata. Icky, ma potrebbe funzionare.

ho un vago sospetto che non vi non è un modo per preservare solo l'impostazione della qualità originale, anche se non ho molto buone ragioni per sospettare che ...

+2

Impostazione PropertyItems e salvare porterà alla perdita di qualità, perché l'immagine viene ricodificato. Maggiori informazioni qui: http://stackoverflow.com/questions/1038206/net-c-library-for-lossless-exif-rewriting – arbiter

+0

Sì, apprezzo che sarà ricodificato - ma penso che abbia senso ricodificare all'incirca la stessa "perdita" dell'originale, se lo si desidera. Stai ancora andando a perdere dati, ma probabilmente non è una grande quantità. Si noti inoltre che non stavo parlando di * setting * PropertyItems - stavo parlando di * recupero * per scoprire la qualità originale, anche se questo non sembra avere i dati rilevanti. –

+0

Bene esiste un elemento propertyitem per il recupero della qualità jpeg - PropertyTagJPEGQuality, ma è indicato come tag privato per adobe photoshop, quindi non so se è riempito dalla fotocamera o meno. Comunque c'è un po 'di senso di memorizzare jpeg con lo stesso valore di qualità jpeg, perché la perdita di qualità sarà lì. – arbiter

0

Leggi qui come risparmiare immagine senza codifica immagine: How-to: Re-encode a JPEG Image with Metadata.

Tuttavia, se si esegue il ritaglio o un'altra manipolazione di immagini è impossibile farlo senza perdita di qualità (beh tecnicamente è possibile eseguire un taglio senza perdite, se si lavora con limiti multipli di 16, ma AFAIK non è possibile essere fatto con le librerie disponibili in .net).

0

È necessario utilizzare i parametri aggiuntivi che indicano a GDI + di rilevare lo schema dei colori.

Ad esempio:

using (var img = Image.FromStream(fileupload.InputStream, true,true)) 
{ 
    img.Save(fileOnDisk, ImageFormat.Jpeg); 
} 

using (var img = Image.FromFile("yourimage", true)) 
{ 
    img.Save(fileOnDisk, ImageFormat.Jpeg); 
} 
Problemi correlati