2017-09-26 5 views
2

J'essaie de recadrer une image et de l'enregistrer sur le serveur. Le problème que je suis est qu'il semble que le processus de culture que je suis a un effet secondaire sur les images jpeg et jpg. La méthode-processus que j'essaie est légèrement différente de celle que j'ai trouvée dans de nombreux articles sur le recadrage d'une image dans asp.net parce que j'utilise un octet [] pour l'image.Recadrer l'image avec des graphiques dans Visual Studio modifie les en-têtes de type de fichier

public static byte[] CropImage(byte[] imgBytes, Rectangle rec) 
    { 
     MemoryStream ms = new MemoryStream(imgBytes); 
     Image img = Image.FromStream(ms); 

     Bitmap croppedBmpImage = new Bitmap(200, 200); 

     using (Graphics gr = Graphics.FromImage(croppedBmpImage)) 
     { 
      gr.SmoothingMode = SmoothingMode.HighQuality; 
      gr.InterpolationMode = InterpolationMode.HighQualityBicubic; 
      gr.PixelOffsetMode = PixelOffsetMode.HighQuality; 
      gr.DrawImage(img, new Rectangle(0, 0, 200, 200), 
       rec, 
       GraphicsUnit.Pixel); 
     } 

     ImageConverter converter = new ImageConverter(); 
     byte[] result = (byte[]) converter.ConvertTo(croppedBmpImage, typeof(byte[])); 
     croppedBmpImage.Dispose(); 

     return result; 
    } 

L'image est recadrée correctement sans aucun problème d'aperçu sur mon ordinateur. Cependant j'utilise Alfresco pour stocker les images et je vois que l'aperçu de la vignette à l'intérieur de l'application ne fonctionne pas avec l'image. D'après ce que j'ai vu, cela n'arrive qu'aux images .jpg et .jpeg. D'après ce que je lis les images .jpg et .jpeg stockent des métadonnées à l'intérieur de celles-ci qui semblent être supprimées de mon image recadrée. Lorsque j'ouvre l'image .jpg ou .jpeg d'origine avec le bloc-notes, je remarque qu'elle commence avec un certain nombre de détails de métadonnées tels que JFIF. (Ψΰ JFIF H H Ϋ «) D'autre part, quand je l'ouvre avec notepad une image .png Je remarque qu'il commence par

‰PNG 

Mon image recadrée commence comme ça aussi après le processus de culture. Est-il possible de conserver les métadonnées d'origine ou de rogner une image en tant que fichier .jpg depuis le début ou est-ce que je manque quelque chose d'autre ici?

+0

Alors qu'est-ce qui se passera si vous enregistrez l'image sans rogner? Est-ce que ça fonctionne correctement? – SeM

+0

Si je n'utilise pas le processus de recadrage cela fonctionne correctement oui. Il ne perd aucune métadonnée et les aperçus d'image correctement dans Alfresco. –

+0

Pourquoi auriez-vous besoin de conserver ces données, cependant? L'image elle-même est recadrée de toute façon, de sorte que vous perdez des données. – Nyerguds

Répondre

3

je peux penser à deux façons:

  1. Enregistrer l'octet [] comme l'image Jpeg, puis l'envoyer à l'utilisateur les nouveaux octets.
  2. Créez un Jpeg vide, puis ajoutez les octets recadrés.

Pour la première option, vous pouvez voir un exemple:

public static byte[] CropImage(byte[] imgBytes, Rectangle rec) 
    { 
     byte[] result = null; 
     using (MemoryStream mStream = new MemoryStream(imgBytes)) 
     { 
      Image img = Image.FromStream(mStream); 

      Bitmap croppedBmpImage = new Bitmap(200, 200); 
      using (Graphics graphics = Graphics.FromImage(croppedBmpImage)) 
      { 
       graphics.SmoothingMode = SmoothingMode.HighQuality; 
       graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; 
       graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; 
       graphics.DrawImage(img, new Rectangle(0, 0, 200, 200), 
        rec, 
        GraphicsUnit.Pixel); 
      } 

      ImageConverter converter = new ImageConverter(); 
      result = (byte[])converter.ConvertTo(croppedBmpImage, typeof(byte[])); 

      using (MemoryStream jpegStream = new MemoryStream(result)) 
      { 
       croppedBmpImage.Save(jpegStream, System.Drawing.Imaging.ImageFormat.Jpeg); 
       Image img1 = Image.FromStream(jpegStream); 
       img1.Save(@"C:\Users\darellis\Desktop\image1.jpg"); 
      } 

      croppedBmpImage.Dispose(); 
     } 

     return result; 
    } 
+0

Merci pour votre réponse et cela fonctionne mais je me demandais s'il y avait un moyen de modifier l'image de recadrage d'une manière qui n'affecte pas les en-têtes .jpeg. Je devine que depuis que je crée un bitmap pour mon processus, le format n'est pas pris en compte et le résultat final est une image aussi simple que possible. Cependant j'apprécierais une explication de la façon dont le processus fonctionne. –

+0

Je ne pense pas que la prise en charge standard .Net jpeg soit assez avancée pour donner à l'export toutes les données d'en-tête JPEG ... ou même pour le lire hors de l'en-tête jpeg d'origine. – Nyerguds