【问题标题】:Why's the generated watermarked image is much more bigger than the original image?为什么生成的水印图像比原始图像大得多?
【发布时间】:2014-11-12 12:26:23
【问题描述】:

我正在使用下面的代码生成带水印的图像,问题是,即使生成的文件尺寸较小,生成的文件总是比原始文件大,例如:

原始.jpg (1920 * 1440) = 1.11 MB

生成的.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

【问题讨论】:

  • 我添加了:g.InterpolationMode = InterpolationMode.Low 大小还是一样,1.77 MB!

标签: c# vb.net image watermark drawimage


【解决方案1】:

你需要指定一个质量,例如:

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;
}

【讨论】:

  • @fero:它实际上超出了我的“生产代码”,但谢谢 ;-)。而且您应该始终在答案中包含代码的关键部分,因为“链接可以消失”...
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    • 2021-03-25
    • 2017-07-11
    • 2016-11-16
    相关资源
    最近更新 更多