Member 14190402 Ответов: 1

C#: как я могу добавить водяной знак изображения в левом нижнем углу изображений каталога?


Я нашел код C# для добавления текстового водяного знака к фотографиям каталога с помощью
FileStream
.
Но у меня есть проблема с этим...

- Как я могу координировать изображение снизу слева(для добавления "Изображение водяного знака"(не текстовый водяной знак) к "внизу слева"угол всех картинок)?

Что я уже пробовал:

C#
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.IO;
using System.Drawing.Imaging;
 
namespace WatermarkImages
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.folderBrowserDialog1.Description =
            "Select the images directory";
 
            // Disallow creation of new files using the FolderBrowserDialog.
            this.folderBrowserDialog1.ShowNewFolderButton = false;
        }
 
       
        private void btnWatermark_Click(object sender, EventArgs e)
        {
            string path = String.Empty;
            DialogResult result = folderBrowserDialog1.ShowDialog();
            if (result == DialogResult.OK)
            {
                path = folderBrowserDialog1.SelectedPath;
            }
 
            if (path == String.Empty)
            {
                lblStatus.Text = "Invalid directory..";
                return;
            }
 
 
            lblStatus.Text = String.Empty;                       
            Image img = null;
            string fullPath = String.Empty;
           
            try
            {
                string[] imgExtension = { "*.jpg", "*.jpeg", ".gif", "*.bmp" };
                List<FileInfo> files = new List<FileInfo>();               
               
                DirectoryInfo dir = new DirectoryInfo(path);
               
                foreach (string ext in imgExtension)
                {
                    FileInfo[] folder = dir.GetFiles(ext, SearchOption.AllDirectories);
                    foreach (FileInfo file in folder)
                    {
                        FileStream fs = file.OpenRead();
                        fullPath = path + @"\" + file.Name ;
           
                        Stream outputStream = new MemoryStream();
                        AddWatermark(fs, "www.dotnetcurry.com", outputStream);
                        fs.Close();
                        file.Delete();
                        img = Image.FromStream(outputStream);
 
                        using (Bitmap savingImage = new Bitmap(img.Width, img.Height, img.PixelFormat))
                        {
                            using (Graphics g = Graphics.FromImage(savingImage))
                                g.DrawImage(img, new Point(0, 0));
                            savingImage.Save(fullPath, ImageFormat.Jpeg);            
                           
                        }
                      
                        img.Dispose();
                       
                    }
                }
                lblStatus.Text = "Processing Completed";
            }
            catch (Exception ex)
           {
               lblStatus.Text = "There was an error during processing..";           
            }
            finally
            {
                if (img != null)
                    img.Dispose();
            }
      }
 
 
        public void AddWatermark(FileStream fs, string watermarkText, Stream outputStream)
        {
            Image img = Image.FromStream(fs);               
            Font font = new Font("Verdana", 16, FontStyle.Bold, GraphicsUnit.Pixel);
            //Adds a transparent watermark with an 100 alpha value.
            Color color = Color.FromArgb(100, 0, 0, 0);
            //The position where to draw the watermark on the image
            Point pt = new Point(10, 30);
            SolidBrush sbrush = new SolidBrush(color);
 
            Graphics gr = null;
            try
            {
                gr = Graphics.FromImage(img);
            }
            catch
            {
                // http://support.microsoft.com/Default.aspx?id=814675
                Image img1 = img;
                img = new Bitmap(img.Width, img.Height);
                gr = Graphics.FromImage(img);
                gr.DrawImage(img1, new Rectangle(0, 0, img.Width, img.Height), 0, 0, img.Width, img.Height, GraphicsUnit.Pixel);
                img1.Dispose();
            }
                       
            gr.DrawString(watermarkText, font, sbrush, pt);
            gr.Dispose();
           
            img.Save(outputStream, ImageFormat.Jpeg);
        }
    
    }
}

1 Ответов

Рейтинг:
7

OriginalGriff

Две вещи: вы не можете "добавить водяной знак в каталог", вам придется добавить его к каждому отдельному изображению отдельно, и у вас есть код для этого.

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

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


Member 14190402

Код, который я отправил сюда, успешно добавляет текстовый водяной знак в каталог с помощью filestream. Все нормально.
Я просто хочу найти разрешение любых изображений в каталоге по одному и вставить водяной знак в нижний левый угол.
поиск изображений по высоте и весу будет работать. но я не знаю, как найти рост и вес из filestream.

OriginalGriff

Вы загружаете поток файлов в изображение - и это изображение имеет свойства ширины и высоты, которые говорят вам, насколько оно велико ... так почему же вы ими не пользуетесь?

Member 14190402

на самом деле я не знаю, как их использовать и куда добавить код.
пожалуйста, скажите мне, знаете ли вы это точно. спасибо.

OriginalGriff

Вы написали код и не знаете, как он работает?

Да ладно тебе ...

Посмотрите на этот код и посмотрите, где вы создаете savingImage - он даже использует ширину и высоту изображения в этой строке!

Member 14190402

Я только что нашел код в Интернете.
и я действительно запутался в этом вопросе

OriginalGriff

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

Посмотрите на код: он не сложный! Просто проследите за ним и выясните, что он делает.

Member 14190402

Я несколько раз пытался изменить код, прежде чем задать вопрос. Я не знаю, почему меня это смущает.
На самом деле после вашей помощи мой мозг начал работать :D...

-Использование ширины и высоты "saveingImage line" не работает, потому что он добавил водяной знак раньше.

Изменения:
60 FileStream fs = файл.OpenRead();
61 fullPath = путь + @"\" + файл.Имя;
//найти размер изображения
63 img = изображение.FromStream(fs);
64 int pHeight = img.Высота;
65 int pWidth = img.Ширина;
------------------------------------------
Я также успешно изменил изображение водяного знака.

Спасибо за помощь

OriginalGriff

Всегда пожалуйста!