2013-03-07 367 views
2

我正在使用MagickNet在我的ASP.NET C#項目中進行圖像處理。我的問題是,我上傳了一張帶有透明度的PNG圖像,當我將其轉換爲JPEG格式時,我得到一個帶有白色斑點的黑色背景,而不是透明部分的白色背景。MagickNet PNG透明度到JPEG

Stream su = upload.FileContent; 

MagickNet.Image testimage = new MagickNet.Image(su); 

testimage.Filter = FilterType.LanczosFilter; 
testimage.Compression = CompressionType.JPEGCompression; 
testimage.QuantizeDither = false; 
testimage.BackgroundColor = new Color(System.Drawing.Color.White); 

testimage.Resize(new System.Drawing.Size(Convert.ToInt32(testimage.Size.Width * 0.4), Convert.ToInt32(testimage.Size.Height * 0.4))); 
testimage.Write(System.Web.HttpContext.Current.Server.MapPath(".") + "\\temp\\" + DateTime.Now.Hour + "-" +DateTime.Now.Minute + "-" + DateTime.Now.Second + ".jpg"); 
su.Close(); 
su.Dispose(); 

testimage.Dispose(); 
Magick.Term(); 

我玩了它,總是得到錯誤的結果,我後。有時我會得到一個透明的背景,但在外部區域的圖像的一些部分有白色的點。我還調整圖像的尺寸以使其小於原來的尺寸。我認爲重新調整它會導致問題。

更新:這是由於某種原因調整大小而導致的。不調整它的作品。說了這麼多,我需要調整大小,所以我需要它來處理它。

謝謝。

+0

您是否在轉換爲jpg或之後調整大小。另外jpg是有損的,所以當png透明的時候你永遠不會得到純白的。 – Karlth 2013-03-07 10:53:31

+0

就像上面的代碼一樣,就像 – 2013-03-07 11:12:56

+0

以上的代碼必須是一種扁平化圖像的方式,這是一種功能。如果沒有調整大小,它會起作用,而且我確實得到純白色,因爲它在這些特定透明區域中沒有顏色是100%透明 – 2013-03-07 11:13:26

回答

0

嘗試複合到白色背景圖像上。所有的

Image bg = new Image(testimage.Size, new ColorRGB(255, 255, 255)); 
testimage = bg.Composite(testimage, 0, 0); 
0

首先,這是更好地與所期望的大小創建MagickImage物體的速度與所需尺寸讀取文件/流可以在一些情況下快100倍。你可能沒有那個錯誤。

using(var testimage = new MagickImage(yourstream/yourFileAddress, width, height) 
{ 
.... 
} 

但如果你轉換MagickImage爲位圖,然後保存該位爲jpg,你可以看到圖像具有白色背景

using (var testBitmap = testimage.ToBitmap()) 
{ 
    testBitmap.Save(@"d:\temp.jpg"); 
} 

也使用要好得多,調用處理成員函數。因爲如果您的代碼在達到dispose調用之前拋出異常,您的對象將保留在內存中。但使用時,如果程序跳出該塊,對象將被丟棄。