2013-03-07 6 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

+0

как в коде выше, точно так же, как код выше –

+0

должен быть способ сгладить изображение, функцию такого типа. Без изменения размера он работает, и я получаю чистый белый цвет, потому что он прозрачен на 100% без цвета в этих конкретных прозрачных областях. –

ответ

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, ваш объект останется в памяти. Но при использовании, если программа выскочит из блока, объект будет удален.

Смежные вопросы