Ruby版给图片加水印
ImageUtils.rb#!/usr/local/bin/rubyrequire 'logger'module ImageUtilsattr_accessor :watermarkTextattr_accessor :watermarkResourceUriattr_accessor :watermarkFontattr_accessor :watermarkImagedef initializeModule@watermarkText = "www.5iyya.com"@watermarkResourceUri = Dir.pwd@watermarkFont = "#{watermarkResourceUri}/fonts/simsun.ttc";@watermarkImage = "#{watermarkResourceUri}/watermark/logo_watermark.jpg"@logger = Logger.new(STDOUT)end#compress image according to given width and heightdef compress(origImages, width, height, suffix = '.summ.jpg')images = ImageList.new(origImages)images.each do |image|begin anImage = image.scale(width, height)anImage.write(buildFileName(image.filename, suffix))rescue Exception => errputs "Compress failed due to : #{err}"ensureimage.destroy! if !image.destroyed?endendreturn imagesend#rename the image namedef renameImage(oriName, destName, keepOld = false, overwrite = true)fileSize = File.size(destName)if File.exist?(destName) && (fileSize == 0 && overwrite) thenputs "File will be deleted since the size is zero and we will overwrite it."File.unlink(destName) endif !File.exists?(destName) || fileSize == 0 thenif keepOld thenFile.link(oriName, destName)elseFile.rename(oriName, destName)endFile.utime(0, Time.now, destName) endend#add watermark text to iamgedef addWatermarkText(origImage, destImage=origImage, watermarkText=@watermarkText, watermarkFont=@watermarkFont)images = ImageList.new(origImage)images.each do |image|begin watermark = Draw.new watermark.annotate(image, 0, 0, 5, 5, watermarkText) do#可设字的位置 self.gravity = SouthEastGravity self.font = watermarkFont #这地方必须使用中文字库,才能打中文到图片上。在windows中c:\windows\fonts\simsun.ttc拷到项目的public \images目录下就可以随着项目使用了。另外注意:笔者是使用utf-8字符集来编辑源文件的,如果你不是,请在程序中对汉字转换编码为utf-8 self.pointsize = 24#字体大小 self.font_weight = BoldWeight self.fill = 'red' #字的颜色 #self.undercolor = 'red' #背景颜色 self.gravity = SouthEastGravity self.stroke = "none" end image.write(destImage)rescue Exception => errputs "addWatermarkText failed due to : #{err}"ensureimage.destroy! if !image.destroyed?endendend#add watermark image to iamgedef addWatermarkImage(origImage, destImage=origImage) images = ImageList.new(origImage)images.each do |image|begin# Make a watermark from the word "RMagick"mark = Image.read(@watermarkImage).firstif !image.columns.nil? thenwidth = image.columns.to_i#puts "width=#{width}"if width >= 1600 then@logger.warn("Image width >= 1600, will be minified twice!!")2.times doimage.minify!endelsif width >= 760 then@logger.warn("Image width >= 760, will be minified once.")image.minify!end# Composite the watermark in the lower right (southeast) corner.if width <= 200 then@logger.warn("Image width <= 200")image.magnify!image.composite!(mark, SouthEastGravity, 0, 0, CopyCompositeOp)elseimage.composite!(mark, SouthEastGravity, 5, 5, CopyCompositeOp)endelse@logger.error("Cannot read image.columns")endimage.write(destImage)rescue Exception => errputs "addWatermarkImage failed due to : #{err}"ensureimage.destroy! if !image.destroyed?endendendprivate def buildFileName(originalName, suffix = '.summ.jpg')#puts "#{originalName}:#{suffix}"return originalName + suffixendend
ImageProcessor.rb
#! /usr/local/bin/ruby require "RMagick"include Magickrequire "ImageUtils"class ImageProcessorinclude ImageUtilsdef initializeinitializeModuleend#rename all images for given dir recursivelydef renameImagesRecursively(dir, originalSuffix = '.summ.jpg', replaceSuffix = '.summ', keepOld = false, overwrite = true)puts "renameImagesRecursively, Root Dir: #{dir}, originalSuffix = #{originalSuffix}, replaceSuffix = #{replaceSuffix}"renameImages(dir, originalSuffix, replaceSuffix, keepOld)Dir.foreach(dir){|item|curDir = dir + "/" + item#filteringif File.ftype(curDir) == "directory" && item != ".."&& item != "." && !item.include?("CVS") && !item.include?(".svn") thenrenameImagesRecursively(curDir, originalSuffix, replaceSuffix, keepOld, overwrite)end}end#rename all images for given dirdef renameImages(dir, originalSuffix = '.summ.jpg', replaceSuffix = '.summ', keepOld = false, overwrite = true)puts "renameImages, Dir: #{dir}, originalSuffix = #{originalSuffix}, replaceSuffix = #{replaceSuffix}"Dir.foreach(dir){|imageName|curItem = dir + "/" + imageNameif imageName.include?(originalSuffix) && !imageName.include?(".summ#{originalSuffix}") thenputs "Update Item: #{dir}/#{imageName}"destName = dir + "/" + imageName.chomp(originalSuffix) + replaceSuffixrenameImage(curItem, destName, keepOld, overwrite)end}end#add watermark and compress all images in given dirdef addWatermarksAndCompressImages(dir, largeSuffix = ".l.jpg", smallSuffix = ".s.jpg")puts "addWatermarksAndCompress, Dir: #{dir}"Dir.foreach(dir){|imageName|curImage = dir + "/" + imageNameif curImage.include?(".jpg") && !curImage.include?("nopic.gif") && !curImage.include?(largeSuffix) && !curImage.include?(smallSuffix) thenputs "Update Item: #{dir}/#{imageName}"begin addWatermarkImage(curImage)compress(curImage, 210, 188, largeSuffix)compress(curImage, 80, 80, smallSuffix)rescue Exception => errputs "Exception : #{err}"ensureendend}end#rename all images for given dir recursivelydef addWatermarksAndCompressImagesRecursively(dir, largeSuffix = ".l.jpg", smallSuffix = ".s.jpg")puts "addWatermarksAndCompressImagesRecursively, ROOT Dir: #{dir}"addWatermarksAndCompressImages(dir, largeSuffix, smallSuffix)Dir.foreach(dir){|item|curDir = dir + "/" + item#filteringif File.ftype(curDir) == "directory" && item != ".."&& item != "." && !item.include?("CVS") && !item.include?(".svn") thenaddWatermarksAndCompressImagesRecursively(curDir, largeSuffix, smallSuffix)end}endend
ImageProcessorTest.rb
#! /usr/local/bin/ruby require 'test/unit'require 'ImageProcessor'class ImageProcessorTest < Test::Unit::TestCasedef setup@processor = ImageProcessor.new@processor.watermarkFont = "test/simsun.ttc"@processor.watermarkText = "www.5iyya.com"@processor.watermarkImage = "test/logo_watermark.jpg"enddef teardown@processor = nilenddef test_renameImage#ImageUtils.renameImage("Cheetah.summ1.jpg", "Cheetah.summ")enddef test_compressprocessedImage = @processor.compress('test/Cheetah.jpg',160, 120, '.summ.jpg')assert_not_nil(processedImage, 'Process image failed.')enddef test_renameImagesRecursivelyDir.chdir("C:/workspace/aiyaa/alibaba/images/images")@processor.renameImagesRecursively(Dir.pwd, ".jpg.l.jpg", ".jpg", true, true);enddef test_copyImagesRecursivelyenddef test_renameImages#Dir.chdir("C:/workspace/aiyaa/alibaba/images/images/jdjy3d")#@processor.renameImages(Dir.pwd, '.jpg.l.jpg', '.jpg', true, true);enddef test_addWatermarksAndCompressImages#@processor.addWatermarksAndCompressImages(Dir.pwd + "/images")enddef test_addWatermarksAndCompressImagesRecursively#@processor.addWatermarksAndCompressImagesRecursively(Dir.pwd + "/images")enddef test_addWatermarkText @processor.addWatermarkText('test/67971251.jpg', 'test/watermark_text.jpg')enddef test_addWatermarkImage @processor.addWatermarkImage('test/67971251.jpg', 'test/watermark_image.jpg')endend
页:
[1]