2014-11-12 3 views
0

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

original.jpg (1920 * 1440) = 1,11 MB

generated.jpg (960 * 720) = 1,77 MB

Могу ли я что-то отсутствует?

C#:

private void AddWaterMark(string target, string NewName, string newwidth, string newheight) 
{ 
    Image imgToResize = Image.FromFile(Path.Combine(target, NewName)); 
    Bitmap indexedImage = new Bitmap(imgToResize, newwidth, newheight); 
    Graphics g = Graphics.FromImage(indexedImage); 
    g.DrawImage(indexedImage, new Rectangle(0, 0, newwidth, newheight), 0, 0, indexedImage.Width, indexedImage.Height, GraphicsUnit.Pixel); 

    g.RotateTransform(-35); 

    g.DrawString("WWW.example.COM", new Font("Verdana", 24, FontStyle.Bold), new SolidBrush(Color.FromArgb(75, 255, 255, 255)), -100, 350); 
    imgToResize.Dispose(); 
    indexedImage.Save(target + "\\" + NewName); 
    indexedImage.Dispose(); 
    g.Dispose(); 

} 

VB:

Private Sub AddWaterMark(target As String, NewName As String, newwidth As String, newheight As String) 

    Dim imgToResize As Image = Image.FromFile(Path.Combine(target, NewName)) 
    Dim indexedImage As New Bitmap(imgToResize, newwidth, newheight) 
    Dim g As Graphics = Graphics.FromImage(indexedImage) 
    g.DrawImage(indexedImage, New Rectangle(0, 0, newwidth, newheight), 0, 0, indexedImage.Width, indexedImage.Height, GraphicsUnit.Pixel) 

    g.RotateTransform(-35) 

    g.DrawString("WWW.example.COM", New Font("Verdana", 24, FontStyle.Bold), New SolidBrush(Color.FromArgb(75, 255, 255, 255)), -100, 350) 
    imgToResize.Dispose() 
    indexedImage.Save(target + "\" + NewName) 
    indexedImage.Dispose() 
    g.Dispose() 

End Sub 
+0

Я добавил: 'g.InterpolationMode = InterpolationMode.Low' Размер все тот же, 1,77 МБ! – Alaa

ответ

3

Вы должны указать качество, например:

var jpgEncoder = GetEncoder(ImageFormat.Jpeg); 
var jpgParameters = new EncoderParameters(1); 
jpgParameters.Param[0] = new EncoderParameter(Encoder.Quality, 80L); 
indexedImage.Save(target + "\\" + NewName, jpgEncoder, jpgParameters); 

и используя этот метод:

private ImageCodecInfo GetEncoder(ImageFormat format) 
{ 
    ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders(); 

    foreach (ImageCodecInfo codec in codecs) 
    { 
     if (codec.FormatID == format.Guid) 
      return codec; 
    } 
    return null; 
} 
+1

+1 Очень упрощенная версия моего связанного примера. – fero

+0

@fero: Это действительно из моего «производственного кода», но спасибо ;-). И вы всегда должны * включать ключевую часть кода * в свой ответ, поскольку «ссылки могут уходить» ... – ChrFin

1

Формат JPEG имеет добротность. Вы можете определить, сколько результирующего изображения будет сжато. Чем больше сжато, тем больше качество вы теряете. Вы можете установить уровень качества в методе Save.

Посмотрите на пример здесь: http://msdn.microsoft.com/en-us/library/ytz20d80%28v=vs.110%29.aspx

Образцы для различных уровней качества можно найти здесь: http://en.wikipedia.org/wiki/JPEG#Effects_of_JPEG_compression

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

  • Нет связанных вопросов^_^