3

我在我的 ASP.NET C# 项目中使用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();

我玩过它,但总是得到我所追求的错误结果。有时我得到一个透明的背景,但外部区域的图像的某些部分有白点。我还将图像的大小调整为小于实际大小。我认为重新调整大小会导致问题。

更新:这是由于某种原因调整大小造成的。无需调整大小即可。话虽如此,我需要调整大小,所以我需要它来处理它。

谢谢。

4

2 回答 2

0

首先,最好创建具有​​所需大小的 MagickImage 对象,在某些情况下,读取所需大小的文件/流的速度可以快 100 倍。你可能没有那个错误。

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

但是如果将 MagickImage 转换为 Bitmap,然后将位图另存为 jpg,您可以看到图像具有白色背景

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

也使用比调用 dispose 成员函数要好得多。因为如果您的代码在到达 dispose 调用之前抛出异常,您的对象将保留在内存中。但是使用时,如果程序跳出块,对象将被释放。

于 2016-07-22T16:56:46.033 回答
0

尝试合成到白色背景图像上。

Image bg = new Image(testimage.Size, new ColorRGB(255, 255, 255));
testimage = bg.Composite(testimage, 0, 0);
于 2015-08-10T17:53:39.633 回答