2013-03-07 129 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调用之前抛出异常,您的对象将保留在内存中。但使用时,如果程序跳出该块,对象将被丢弃。