MagickNet PNG с прозрачностью в JPEG

Я использую MagickNet для работы с изображениями в моем проекте ASP.NET C#. Моя проблема в том, что я загружаю изображение 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();

Я играл с этим и всегда получаю неправильный результат, который мне нужен. Иногда я получаю прозрачный фон, но некоторые части изображения во внешней области имеют белые точки. Я также изменяю размер изображения, чтобы оно было меньше, чем оно есть. Я думаю, что изменение размера вызывает проблему.

обновление: это вызвано из-за изменения размера по какой-то причине. Без изменения размера это работает. Сказав это, мне нужно изменить размер, поэтому мне нужно работать с ним.

Благодарю.

2 ответа

Попробуйте составить изображение на белом фоне.

Image bg = new Image(testimage.Size, new ColorRGB(255, 255, 255));
testimage = bg.Composite(testimage, 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. Потому что если ваш код выдает исключение до того, как он достигнет вызова dispose, ваш объект останется в памяти. Но с помощью, если программа выпрыгнет из блока, объект будет ликвидирован.

Другие вопросы по тегам