Ruby版给图片加水印

ImageUtils.rb

#!/usr/local/bin/ruby

require 'logger'

module ImageUtils

attr_accessor :watermarkText
attr_accessor :watermarkResourceUri
attr_accessor :watermarkFont
attr_accessor :watermarkImage

def 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 height
def 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 => err
puts "Compress failed due to : #{err}"
ensure
image.destroy! if !image.destroyed?
end
end
return images
end

#rename the image name
def renameImage(oriName, destName, keepOld = false, overwrite = true)
fileSize = File.size(destName)
if File.exist?(destName) && (fileSize == 0 && overwrite) then
puts "File will be deleted since the size is zero and we will overwrite it."
File.unlink(destName)
end
if !File.exists?(destName) || fileSize == 0 then
if keepOld then
File.link(oriName, destName)
else
File.rename(oriName, destName)
end
File.utime(0, Time.now, destName)
end
end

#add watermark text to iamge
def 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 => err
puts "addWatermarkText failed due to : #{err}"
ensure
image.destroy! if !image.destroyed?
end
end
end

#add watermark image to iamge
def addWatermarkImage(origImage, destImage=origImage)
images = ImageList.new(origImage)
images.each do |image|
begin
# Make a watermark from the word "RMagick"
mark = Image.read(@watermarkImage).first

if !image.columns.nil? then
width = image.columns.to_i
#puts "width=#{width}"
if width >= 1600 then
@logger.warn("Image width >= 1600, will be minified twice!!")
2.times do
image.minify!
end
elsif 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)
else
image.composite!(mark, SouthEastGravity, 5, 5, CopyCompositeOp)
end
else
@logger.error("Cannot read image.columns")
end
image.write(destImage)

rescue Exception => err
puts "addWatermarkImage failed due to : #{err}"
ensure
image.destroy! if !image.destroyed?
end
end
end

private
def buildFileName(originalName, suffix = '.summ.jpg')
#puts "#{originalName}:#{suffix}"
return originalName + suffix
end

end


ImageProcessor.rb

#! /usr/local/bin/ruby

require "RMagick"
include Magick
require "ImageUtils"

class ImageProcessor
include ImageUtils

def initialize
initializeModule
end

#rename all images for given dir recursively
def 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
#filtering
if File.ftype(curDir) == "directory" && item != ".." && item != "." && !item.include?("CVS") && !item.include?(".svn") then
renameImagesRecursively(curDir, originalSuffix, replaceSuffix, keepOld, overwrite)
end
}
end

#rename all images for given dir
def 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 + "/" + imageName
if imageName.include?(originalSuffix) && !imageName.include?(".summ#{originalSuffix}") then
puts "Update Item: #{dir}/#{imageName}"
destName = dir + "/" + imageName.chomp(originalSuffix) + replaceSuffix
renameImage(curItem, destName, keepOld, overwrite)
end
}
end

#add watermark and compress all images in given dir
def addWatermarksAndCompressImages(dir, largeSuffix = ".l.jpg", smallSuffix = ".s.jpg")
puts "addWatermarksAndCompress, Dir: #{dir}"
Dir.foreach(dir){|imageName|
curImage = dir + "/" + imageName
if curImage.include?(".jpg") && !curImage.include?("nopic.gif") && !curImage.include?(largeSuffix) && !curImage.include?(smallSuffix) then
puts "Update Item: #{dir}/#{imageName}"
begin
addWatermarkImage(curImage)
compress(curImage, 210, 188, largeSuffix)
compress(curImage, 80, 80, smallSuffix)

rescue Exception => err
puts "Exception : #{err}"
ensure
end
end
}
end

#rename all images for given dir recursively
def addWatermarksAndCompressImagesRecursively(dir, largeSuffix = ".l.jpg", smallSuffix = ".s.jpg")
puts "addWatermarksAndCompressImagesRecursively, ROOT Dir: #{dir}"
addWatermarksAndCompressImages(dir, largeSuffix, smallSuffix)
Dir.foreach(dir){|item|
curDir = dir + "/" + item
#filtering
if File.ftype(curDir) == "directory" && item != ".." && item != "." && !item.include?("CVS") && !item.include?(".svn") then
addWatermarksAndCompressImagesRecursively(curDir, largeSuffix, smallSuffix)
end
}
end

end


ImageProcessorTest.rb

#! /usr/local/bin/ruby

require 'test/unit'
require 'ImageProcessor'

class ImageProcessorTest < Test::Unit::TestCase

def setup
@processor = ImageProcessor.new
@processor.watermarkFont = "test/simsun.ttc"
@processor.watermarkText = "www.5iyya.com"
@processor.watermarkImage = "test/logo_watermark.jpg"
end

def teardown
@processor = nil
end

def test_renameImage
#ImageUtils.renameImage("Cheetah.summ1.jpg", "Cheetah.summ")
end

def test_compress
processedImage = @processor.compress('test/Cheetah.jpg',160, 120, '.summ.jpg')
assert_not_nil(processedImage, 'Process image failed.')
end

def test_renameImagesRecursively
Dir.chdir("C:/workspace/aiyaa/alibaba/images/images")
@processor.renameImagesRecursively(Dir.pwd, ".jpg.l.jpg", ".jpg", true, true);
end

def test_copyImagesRecursively

end

def test_renameImages
#Dir.chdir("C:/workspace/aiyaa/alibaba/images/images/jdjy3d")
#@processor.renameImages(Dir.pwd, '.jpg.l.jpg', '.jpg', true, true);
end

def test_addWatermarksAndCompressImages
#@processor.addWatermarksAndCompressImages(Dir.pwd + "/images")
end

def test_addWatermarksAndCompressImagesRecursively
#@processor.addWatermarksAndCompressImagesRecursively(Dir.pwd + "/images")
end

def test_addWatermarkText
@processor.addWatermarkText('test/67971251.jpg', 'test/watermark_text.jpg')
end

def test_addWatermarkImage
@processor.addWatermarkImage('test/67971251.jpg', 'test/watermark_image.jpg')
end
end

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值