Здравствуйте! Сегодня: Пн, 19 Ноя 2018, Ваш IP: 54.221.75.115 Войти через loginza
 
Вход | Регистрация | Забыли пароль?
Мой Kbyte.Ru
> Группа «EasyWatermark» - Форум
+ Создать новую тему Страница: 1
Тема: Нанесение водяных знаков с перезаписью оригинальных изображений · +  +  дата добавления: 21.02.2012 / 17:03
Автор темы:
Алексей Немиро
Алексей Немиро
тем: 534 / ответов: 5130 / благодарностей: 325 / репутация: 211
Чашка Kbyte.Ru>>
Администратор
Url: aleksey.nemiro.ru
Icq: 261779681
Skype: alekseynemiro
ответов: 5130
создал(а) тем: 534


Простой пример нанесения водяных знаков с перезаписью оригинальных файлов.

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

Imports System.Threading
Imports System.IO

Public Class Form1

  Private myWatermark As EasyWatermarkLib.Pattern

  Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    If Not FolderBrowserDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then Return
    TextBox1.Text = FolderBrowserDialog1.SelectedPath
  End Sub

  Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
    If Not OpenFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then Return
    TextBox2.Text = OpenFileDialog1.FileName
  End Sub

  Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    If String.IsNullOrEmpty(TextBox1.Text) Then
      MessageBox.Show("Выберите папку с фотографиями.")
      Return
    End If
    If String.IsNullOrEmpty(TextBox2.Text) Then
      MessageBox.Show("Выберите шаблон водяных знаков EasyWatermark (см. папку patterns, находящуюся в корневом каталоге программы EasyWatermark).")
      Return
    End If
    Try
      myWatermark = New EasyWatermarkLib.Pattern(TextBox2.Text)
      ProgressBar1.Value = 0
      Button1.Enabled = False
      Button2.Enabled = False
      Button3.Enabled = False

      Dim t As New Thread(AddressOf Run)
      t.IsBackground = True
      t.Start()
    Catch ex As Exception
      MessageBox.Show("Ошибка. " & ex.Message)
    End Try
  End Sub

  Private Sub Run()
    Try
      'создание списка папок
      SetStatus("Построение списка папок...")
      Dim dirs As New List(Of String)
      dirs.Add(TextBox1.Text)
      FillChildDirectories(TextBox1.Text, dirs)
      'создание списка файлов
      SetStatus("Построение списка файлов...")

      Dim extensions As New List(Of String)
      extensions.Add("jpg")
      extensions.Add("jpeg")

      Dim files As New List(Of String)
      For Each d As String In dirs
        For Each extension As String In extensions
          For Each f As String In Directory.GetFiles(d, String.Format("*.{0}", extension), SearchOption.TopDirectoryOnly)
            files.Add(f)
          Next
        Next
      Next

      SetStatus("Нанесение водяных знаков...")
      SetProgress(files.Count, 0)

      Dim i As Integer = 0
      For Each f As String In files
        Using m As New MemoryStream(File.ReadAllBytes(f))

          File.Delete(f)

          Using img As Image = myWatermark.GetImage(m)
            'кодеки
            Dim myEncoder As System.Drawing.Imaging.Encoder = System.Drawing.Imaging.Encoder.Quality
            Dim myEncoderParameter As System.Drawing.Imaging.EncoderParameter
            Dim myEncoderParameters As New System.Drawing.Imaging.EncoderParameters(1)
            Dim myImageCodecInfo As System.Drawing.Imaging.ImageCodecInfo
            myImageCodecInfo = GetEncoderInfo(System.Drawing.Imaging.ImageFormat.Jpeg)
            myEncoderParameter = New System.Drawing.Imaging.EncoderParameter(myEncoder, CType(75L, Integer)) '75 - качество изображение, от 0 до 100
            myEncoderParameters.Param(0) = myEncoderParameter

            img.Save(f, myImageCodecInfo, myEncoderParameters)
          End Using
        End Using

        i += 1
        SetProgress(files.Count, i)
      Next

      SetStatus("Готово!")
      Beep()
      Ok()

    Catch ex As Exception
      SetStatus("Ошибка: " & ex.Message)
      Beep()
    End Try
  End Sub

  'функция для установки качества (степени сжатия) JPEG
  Private Function GetEncoderInfo(ByVal format As System.Drawing.Imaging.ImageFormat) As System.Drawing.Imaging.ImageCodecInfo
    Dim j As Integer
    Dim encoders() As System.Drawing.Imaging.ImageCodecInfo
    encoders = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders()
    j = 0
    While j < encoders.Length
      If encoders(j).FormatID = format.Guid Then
        Return encoders(j)
      End If
      j += 1
    End While
    Return Nothing
  End Function 'GetEncoderInfo

  Private Sub FillChildDirectories(path As String, ByRef dirs As List(Of String))
    For Each d As String In Directory.GetDirectories(path)
      FillChildDirectories(d, dirs)
      dirs.Add(d)
    Next
  End Sub

  Private Sub SetStatus(msg As String)
    If InvokeRequired Then
      Invoke(New Action(Of String)(AddressOf SetStatus), msg)
    End If
    lblStatus.Text = msg
  End Sub

  Private Sub SetProgress(max As Integer, val As Integer)
    If InvokeRequired Then
      Invoke(New Action(Of Integer, Integer)(AddressOf SetProgress), max, val)
    End If
    ProgressBar1.Maximum = max
    If val <= max Then
      ProgressBar1.Value = val
    End If
  End Sub

  Private Sub Ok()
    If InvokeRequired Then
      Invoke(New Action(AddressOf Ok))
    End If
    Button1.Enabled = True
    Button2.Enabled = True
    Button3.Enabled = True
    MessageBox.Show("Водяные знаки успешно нанесены!")
  End Sub

End Class
см. файл проекта внизу.
Технологии: Visual Basic .NET

+ EasyWatermarkOverwriter.zip (71,12 Кб)  

Нет ответов в этой теме...

Страница: 1 + Создать новую тему