2015-10-28 4 views
1

J'utilise le code suivant pour compresser une image et cela fait du bon travail mais je veux utiliser l'image compressée et ne pas l'enregistrer. Donc maintenant je dois enregistrer l'image puis la relire, ce qui est lent. Y a-t-il un moyen de le compresser sans le sauvegarder?Compresser l'image sans l'enregistrer

private void compress(System.Drawing.Image img, long quality, ImageCodecInfo codec) 
    { 
     EncoderParameters parameters = new EncoderParameters(1); 
     parameters.Param[0] = new EncoderParameter(Encoder.Quality, quality); 
     img.Save("check1.jpg", codec, parameters); 
    } 

    private static ImageCodecInfo GetCodecInfo(string mimeType) 
    { 
     foreach (ImageCodecInfo encoder in ImageCodecInfo.GetImageEncoders()) 
      if (encoder.MimeType == mimeType) 
       return encoder; 
     throw new ArgumentOutOfRangeException(
      string.Format("'{0}' not supported", mimeType)); 
    } 

Répondre

4

Il y a un overload that takes a Stream afin que vous puissiez enregistrer directement à un MemoryStream et ne devrez enregistrer sur le disque/reload.

EncoderParameters parameters = new EncoderParameters(1); 
parameters.Param[0] = new EncoderParameter(Encoder.Quality, quality); 

var ms = new MemoryStream(); 
img.Save(ms, codec, parameters); 

//Do whatever you need to do with the image 
//e.g. 
img = Image.FromStream(ms); 

La raison pour laquelle vous obtenez le « paramètre non valide » exception que vous mentionnez dans les commentaires est parce que l'image n'est pas éliminé avant d'essayer d'appeler FromStream, vous aurez donc besoin de le disposer . Aussi, je ne sais pas comment vous appelez cette méthode, mais vous devriez probablement la mettre à jour pour retourner le MemoryStream.

private void compress(System.Drawing.Image img, long quality, ImageCodecInfo codec) 
{ 
    EncoderParameters parameters = new EncoderParameters(1); 
    parameters.Param[0] = new EncoderParameter(Encoder.Quality, quality); 

    var ms = new MemoryStream(); 
    img.Save(ms, codec, parameters); 
    return ms; 
} 

public void MyMethod() 
{ 
    MemoryStream ms; 
    using(var img = Image.FromFile("myfilepath.img")) 
    { 
     ms = compress(img, /*quality*/, /*codec*/); 
    } 

    using(var compressedImage = Image.FromStream(ms)) 
    { 
     //Use compressedImage 
    } 
} 

Remarquez que je reviens ms de compression et de le capturer. En outre, plus important encore, comment nous terminerons la img initiale dans un communiqué using qui disposera le fichier gérer correctement et après qui obtient disposé à créer la deuxième compressedImage qui est aussi dans un using il sera aussi s'éliminés de façon appropriée quand tu as fini.

+0

Lors de la sauvegarde je reçois maintenant ceci: Une exception non gérée de type 'System.ArgumentException' s'est produite dans System.Drawing.dll Informations supplémentaires: Le paramètre n'est pas valide. – kgsw

+0

Si vous regardez le lien que j'ai fourni, cette surcharge ne lance pas 'ArgumentException', seulement' ArgumentNullException' et 'ExternalException'. Êtes-vous sûr de recevoir une 'ArgumentException'? Êtes-vous sûr que c'est sur la ligne 'img.Save'? –

+0

C'est certainement la ligne de sauvegarde et ceci est copié à partir de l'écran \ Une exception non gérée de type 'System.ArgumentException' s'est produite dans System.Drawing.dll Informations supplémentaires: Le paramètre n'est pas valide. – kgsw