2017-09-26 2 views
2

Ich versuche, ein Bild zu beschneiden und es auf dem Server zu speichern. Das Problem, das ich habe, ist, dass es scheint, dass der Beschneidungsprozess, den ich befolge, eine Nebenwirkung auf die JPEG- und JPG-Bilder hat. Die Prozess-Methode, die ich versuche, ist etwas anders als die, die ich in zahlreichen Posts über das Beschneiden eines Bildes in asp.net gefunden habe, weil ich ein Byte [] für das Bild verwende.Bild mit Grafiken in Visual Studio zuschneiden ändert Dateitypen Header

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; 
    } 

Das Bild wird korrekt abgeschnitten, ohne Probleme mit der Vorschau in meinem Computer. Allerdings verwende ich Alfresco, um die Bilder zu speichern, und ich sehe, dass die Miniaturvorschau in der Anwendung nicht mit dem Bild funktioniert. Von dem, was ich gesehen habe, passiert das nur mit .jpg und .jpeg Bildern. Von dem, was ich gelesen habe .jpg und .jpeg Bilder speichern einige Metadaten in ihnen, die scheinen, von meinem beschnittenen Bild gelöscht zu werden. Wenn ich das ursprüngliche .jpg oder .jpeg Bild mit Notizblock öffne, bemerke ich, dass es mit einigen König von Metadatendetails wie JFIF anfängt. (Ψΰ JFIF H H Ϋ „) Auf der anderen Seite, wenn ich mit Notepad öffnen ein .png Bild, das ich es bemerken beginnt mit

‰PNG 

Mein beschnittene Bild beginnt wie das auch nach dem Zuschneiden Prozess. Gibt es eine Möglichkeit, die ursprünglichen Metadaten festzuhalten oder ein Bild als JPG-Datei von Anfang an zu beschneiden, oder fehlt mir hier etwas anderes?

+0

Also, was passieren wird, wenn Sie Bild speichern, ohne Zuschneiden? Funktioniert es richtig? – SeM

+0

Wenn ich den Cropping-Prozess nicht benutze funktioniert es ja. In Alfresco werden keine Metadaten und keine Vorschau der Bilder angezeigt. –

+0

Warum sollten Sie diese Daten speichern? Das Bild selbst wird trotzdem abgeschnitten, so dass Daten sicher verloren gehen. – Nyerguds

Antwort

3

Ich denke an zwei Möglichkeiten:

  1. Speichern Sie die byte [] als JPEG-Bild und dann die neuen Bytes zurück an den Benutzer senden.
  2. Erstellen Sie ein leeres JPEG und fügen Sie dann die beschnittenen Bytes an.

Für die erste Option, die Sie ein Beispiel sehen:

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

Vielen Dank für Ihre Antwort und es funktioniert, aber ich habe mich gefragt, ob es eine Möglichkeit gibt, das zugeschnittene Bild so zu ändern, dass die .jpeg-Header nicht betroffen sind. Ich nehme an, dass, seit ich eine Bitmap für meinen Prozess erstellt habe, das Format nicht berücksichtigt wird und das Endergebnis ist ein Bild so einfach wie möglich. Ich würde jedoch eine Erklärung für die Funktionsweise des Prozesses begrüßen. –

+0

Ich glaube nicht, dass die .Net-JPEG-Standardunterstützung fortgeschritten genug ist, um den Export aller ursprünglichen JPEG-Header-Daten zu geben ... oder sogar, sie aus dem ursprünglichen JPEG-Header auszulesen. – Nyerguds