2017-09-26 151 views
2

我正在嘗試裁剪圖像並將其保存到服務器。我遇到的問題是,我認爲裁剪過程似乎對jpeg和jpg圖像有副作用。 我嘗試的過程方法與我在許多關於在asp.net中裁剪圖像的帖子中發現的過程方法稍有不同,因爲我正在使用字節[]作爲圖像。在Visual Studio中使用圖形裁剪圖像更改文件類型標題

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

在我的電腦中沒有任何預覽問題,圖像被正確裁剪。不過,我正在使用Alfresco來存儲圖像,我發現應用程序內的縮略圖預覽不適用於圖像。從我看到的這隻發生在.jpg和.jpeg圖像上。從我讀的.jpg和.jpeg圖像存儲一些元數據,似乎從我的裁剪圖像中刪除。 當我用記事本打開原始.jpg或.jpeg圖像時,我注意到它開始於某些元數據細節之王,如JFIF。 (ΨΰJFIF H HΫ「) ,當我用記事本打開的PNG圖片我注意到它與

‰PNG 

我裁剪圖像開始另一方面開始像修剪處理後太那個。有沒有辦法保留原始的元數據或從一開始就以.jpg文件的形式裁剪圖像,還是我在這裏丟失了別的東西?

+0

所以,如果你存儲的圖像不裁剪會發生什麼?它工作正常嗎? – SeM

+0

如果我不使用裁剪過程它正常工作是的。它不會在Alfresco中正確地丟失任何元數據和圖像預覽。 –

+0

但是,爲什麼你需要保留這些數據呢?無論如何,圖像本身都會被裁剪掉,這樣肯定會丟失數據。 – Nyerguds

回答

3

我能想到的方法有兩種:

  1. 保存爲JPEG圖像字節[],然後發送新的字節返回給用戶。
  2. 創建一個空的Jpeg,然後附加裁剪的字節。

對於第一種選擇,你可以看到一個例子:

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

謝謝你的答案,它的工作原理,但我想知道是否有一種方式來改變裁剪圖像的方式,不會影響.jpeg頭。我猜測,因爲我爲我的過程創建了一個位圖,所以沒有考慮格式,最終結果是圖像儘可能簡單。不過,我希望對該流程的工作方式有所解釋。 –

+0

我不認爲標準的.Net jpeg支持足夠先進,可以導出所有原始jpeg標題數據......甚至可以將其從原始jpeg標題中讀出。 – Nyerguds