在图像上设置水印并将其保存为原始质量

时间:2011-10-16 06:53:20

标签: c# asp.net c#-4.0 asp.net-4.0

我在网站上传了一张照片,我想在其上设置水印并保存原始质量。为了测试,我创建了C#应用程序。

class Class1
    {
        public static string GetContentType(String path)
        {
            switch (Path.GetExtension(path))
            {
                case ".bmp": return "Image/bmp";
                case ".gif": return "Image/gif";
                case ".jpg": return "Image/jpeg";
                case ".png": return "Image/png";
                default: break;
            }
            return String.Empty;
        }

        public static ImageFormat GetImageFormat(String path)
        {
            switch (Path.GetExtension(path).ToLower())
            {
                case ".bmp": return ImageFormat.Bmp;
                case ".gif": return ImageFormat.Gif;
                case ".jpg": return ImageFormat.Jpeg;
                case ".png": return ImageFormat.Png;
                default: return null;
            }
        }

        public static void AddWaterMark(string sourceFile, string destinationPath)
        {

            // Normally you’d put this in a config file somewhere.
            string watermark = "http://mysite.com/";

            Image image = Image.FromFile(sourceFile);

            Graphics graphic;
            if (image.PixelFormat != PixelFormat.Indexed &&
                image.PixelFormat != PixelFormat.Format8bppIndexed &&
                image.PixelFormat != PixelFormat.Format4bppIndexed &&
                image.PixelFormat != PixelFormat.Format1bppIndexed)
            {

                graphic = Graphics.FromImage(image);
            }
            else
            {

                Bitmap indexedImage = new Bitmap(image);
                graphic = Graphics.FromImage(indexedImage);

                // Draw the contents of the original bitmap onto the new bitmap.
                graphic.DrawImage(image, 0, 0, image.Width, image.Height);
                image = indexedImage;
            }
            graphic.SmoothingMode = SmoothingMode.AntiAlias & SmoothingMode.HighQuality;

            Font myFont = new Font("Arial", 20);
            SolidBrush brush = new SolidBrush(Color.FromArgb(80, Color.White));

            //This gets the size of the graphic 

            SizeF textSize = graphic.MeasureString(watermark, myFont);

            // Code for writing text on the image. 

            PointF pointF = new PointF(430, 710);
            graphic.DrawString(watermark, myFont, brush, pointF);
            image.Save(destinationPath, GetImageFormat(sourceFile));
            graphic.Dispose();
        }

    }

//And using
class Program
    {

        private static string file1 = "C:\\1.JPG";
        private static string file1_withwatermark = "C:\\1_withwatermark.JPG";
        static void Main(string[] args)
        {
            Class1.AddWaterMark(file1, file1_withwatermark);
        }
}

file1的分辨率为3648x2736,大小为4Mb

我不明白的第一件事是为什么file1_withwatermark没有水印?

第二个问题是为什么file1_withwatermark的大小为1Mb,但它的分辨率也是3648x2736!我希望以原始质量保存file1_withwatermarkfile1_withwatermark的大小必须大约为4Mb

2 个答案:

答案 0 :(得分:2)

部分答案;请注意,JPEG是一种有损压缩方法。因此,在保存的图像中丢失与原始图像相比的实际图像质量。

即使您以更高的质量级别保存,也会产生比原始文件更大的文件。

对于一个或两个重新保存文件的实例而言,这不是一个大问题,但在考虑编辑过的JPEG压缩图像的“质量”和文件大小时,请记住这一点。

答案 1 :(得分:1)

两个想法:1)尝试交换保存和处理线;在保存之前,您可能有未完成的待处理图形操作。 2)如果是jpeg img,则需要指定质量等级。见High quality JPEG compression with c#