Установите водяной знак на изображение и сохраните его в оригинальном качестве - PullRequest
1 голос
/ 16 октября 2011

Я загружаю фотографию на веб-сайт и хочу установить на нее водяной знак и сохранить его в оригинальном качестве.Для тестирования я создаю приложение на 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_withwatermark в оригинальном качестве, то есть размер file1_withwatermark должен быть около 4Mb.

Ответы [ 2 ]

2 голосов
/ 16 октября 2011

Частичный ответ;Обратите внимание, что JPEG - это метод сжатия с потерями.В результате вы потеряете фактического качества изображения в сохраненном изображении по сравнению с оригиналом.

Это применимо, даже если вы сохраните файл с более высоким уровнем качества, что приведет к увеличению размера файла по сравнению с оригиналом.

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

1 голос
/ 16 октября 2011

Две мысли: 1) Попробуйте поменять строки сохранения и удаления;у вас может быть ожидающая графическая операция, которая не завершена перед сохранением.2) Если это jpeg img, вам нужно указать уровень качества.См. Высококачественное сжатие JPEG с помощью c #

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...