views:

722

answers:

3

Anyone know? Want to be able to on the fly stamp an image with another image as a watermark, also to do large batches. Any type of existing library or a technique you know of would be great.

+10  A: 

This will answer your question:

http://www.codeproject.com/KB/GDI-plus/watermark.aspx

Good luck!

Ian P
I was going to recommend using GDI plus as well, good job.
Mike Brown
Good article, shows adding text and image-based watermarks.
Liam
+3  A: 

I have had good luck with ImageMagick. It has an API for .NET too.

Geoffrey Chetwood
+2  A: 

here is my full article: http://forums.asp.net/p/1323176/2634923.aspx

use the SDK Command Prompt and navigate the active folder to the folder containing the below source code... then compile the code using


vbc.exe watermark.vb /t:exe /out:watermark.exe

this will create an exe in the folder.. the exe accepts two parameters: ex.


watermark.exe "c:\source folder" "c:\destination folder"

this will iterate through the parent folder and all subfolders. all found jpegs will be watermarked with the image you specify in the code and copied to the destination folder. The original image will stay untouched.

// watermark.vb --


Imports System
Imports System.Drawing
Imports System.Drawing.Drawing2D
Imports System.Drawing.Imaging
Imports System.IO

Namespace WatermarkManager
    Class Watermark
     Shared sourceDirectory As String = "", destinationDirectory As String = ""

     Overloads Shared Sub Main(ByVal args() As String)

      'See if an argument was passed from the command line
      If args.Length = 2 Then
       sourceDirectory = args(0)
       destinationDirectory = args(1)

       ' make sure sourceFolder is legit
       If Directory.Exists(sourceDirectory) = False
        TerminateExe("Invalid source folder. Folder does not exist.")
        Exit Sub
       End If

       ' try and create destination folder
       Try
        Directory.CreateDirectory(destinationDirectory)
       Catch
        TerminateExe("Error creating destination folder. Invalid path cannot be created.")
        Exit Sub
       End Try

       ' start the magic
       CreateHierarchy(sourceDirectory,destinationDirectory)

      ElseIf args.Length = 1
       If args(0) = "/?"
        DisplayHelp()
       Else
        TerminateExe("expected: watermark.exe [source path] [destination path]")
       End If
       Exit Sub
      Else
       TerminateExe("expected: watermark.exe [source path] [destination path]")
       Exit Sub
      End If

      TerminateExe()
     End Sub

     Shared Sub CreateHierarchy(ByVal sourceDirectory As String, ByVal destinationDirectory As String)

      Dim tmpSourceDirectory As String = sourceDirectory

      ' copy directory hierarchy to destination folder
      For Each Item As String In Directory.GetDirectories(sourceDirectory)
       Directory.CreateDirectory(destinationDirectory + Item.SubString(Item.LastIndexOf("\")))

       If hasSubDirectories(Item)
        CreateSubDirectories(Item)
       End If
      Next

      ' reset destinationDirectory
      destinationDirectory = tmpSourceDirectory

      ' now that folder structure is set up, let's iterate through files
      For Each Item As String In Directory.GetDirectories(sourceDirectory)
       SearchDirectory(Item)
      Next
     End Sub

     Shared Function hasSubDirectories(ByVal path As String) As Boolean
      Dim subdirs() As String = Directory.GetDirectories(path)
      If subdirs.Length > 0
       Return True
      End If
      Return False
     End Function

     Shared Sub CheckFiles(ByVal path As String)
      For Each f As String In Directory.GetFiles(path)
       If f.SubString(f.Length-3).ToLower = "jpg"
        WatermarkImage(f)
       End If
      Next
     End Sub

     Shared Sub WatermarkImage(ByVal f As String)

      Dim img As System.Drawing.Image = System.Drawing.Image.FromFile(f)
      Dim graphic As Graphics
      Dim indexedImage As New Bitmap(img)
      graphic = Graphics.FromImage(indexedImage)
      graphic.DrawImage(img, 0, 0, img.Width, img.Height)
      img = indexedImage

      graphic.SmoothingMode = SmoothingMode.AntiAlias
      graphic.InterpolationMode = InterpolationMode.HighQualityBicubic

      Dim x As Integer, y As Integer
      Dim source As New Bitmap("c:\watermark.png")
      Dim logo As New Bitmap(source, CInt(img.Width / 3), CInt(img.Width / 3))
      source.Dispose()
      x = img.Width - logo.Width
      y = img.Height - logo.Height
      graphic.DrawImage(logo, New Point(x,y))
      logo.Dispose()

      img.Save(destinationDirectory+f.SubString(f.LastIndexOf("\")), ImageFormat.Jpeg)
      indexedImage.Dispose()
      img.Dispose()
      graphic.Dispose()

      Console.WriteLine("successfully watermarked " + f.SubString(f.LastIndexOf("\")+1))
      Console.WriteLine("saved to: " + vbCrLf + destinationDirectory + vbCrLf)

     End Sub

     Shared Sub SearchDirectory(ByVal path As String)
      destinationDirectory = destinationDirectory + path.SubString(path.LastIndexOf("\"))
      CheckFiles(path)
      For Each Item As String In Directory.GetDirectories(path)
       destinationDirectory += Item.SubString(Item.LastIndexOf("\"))

       CheckFiles(Item)

       If hasSubDirectories(Item)
        destinationDirectory = destinationDirectory.SubString(0,destinationDirectory.LastIndexOf("\"))
        SearchDirectory(Item)
        destinationDirectory += Item.SubString(Item.LastIndexOf("\"))
       End If
       destinationDirectory = destinationDirectory.SubString(0,destinationDirectory.LastIndexOf("\"))
      Next
      destinationDirectory = destinationDirectory.SubString(0,destinationDirectory.LastIndexOf("\"))
     End Sub

     Shared Sub CreateSubDirectories(ByVal path As String)
      destinationDirectory = destinationDirectory + path.SubString(path.LastIndexOf("\"))
      For Each Item As String In Directory.GetDirectories(path)
       destinationDirectory += Item.SubString(Item.LastIndexOf("\"))
       Directory.CreateDirectory(destinationDirectory)
       Console.WriteLine(vbCrlf + "created: " + vbCrlf + destinationDirectory)

       If hasSubDirectories(Item)
        destinationDirectory = destinationDirectory.SubString(0,destinationDirectory.LastIndexOf("\"))
        CreateSubDirectories(Item)
        destinationDirectory += Item.SubString(Item.LastIndexOf("\"))
       End If
       destinationDirectory = destinationDirectory.SubString(0,destinationDirectory.LastIndexOf("\"))
      Next
      destinationDirectory = destinationDirectory.SubString(0,destinationDirectory.LastIndexOf("\"))
     End Sub

     Shared Sub TerminateExe(ByVal Optional msg As String = "")
      If msg  ""
       Console.WriteLine(vbCrLf + "AN ERROR HAS OCCURRED //" + vbCrLf + msg)
      End If
      Console.WriteLine(vbCrLf + "Press [enter] to close...")
      'Console.Read()
     End Sub

     Shared Sub DisplayHelp()
      Console.WriteLine("watermark.exe accepts two parameters:" + vbCrLf + " - [source folder]")
      Console.WriteLine(" - [destination folder]")
      Console.WriteLine("ex." + vbCrLf + "watermark.exe ""c:\web_projects\dclr source"" ""d:\new_dclr\copy1 dest""")
      Console.WriteLine(vbCrLf + "Press [enter] to close...")
      Console.Read()
     End Sub
    End Class
End Namespace
John West