`

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

分享到:
评论

相关推荐

    按键精灵IOS手机版图片加水印

    按键精灵手机版IOS,图片加水印源码,可实现给图片加水印。把水印图片加到主图片里面。暂时只支持IOS系统。

    Delphi给图片加水印

    应为项目需要,给图片加图片水印,查阅了许多资料都不理想,最后使用ImageEN 5.2.0 FullSource控件解决,效果比较满意。 案例使用delphi7+ImageEN 5.2.0 FullSource制作,里面有ImageEN控件的安装方法。

    易语言图片加水印

    在“易语言图片加水印”这个主题中,我们主要探讨如何利用易语言来实现对图片添加水印的功能。水印通常用于保护版权,或者为图像增添个性化的标识。 首先,我们要理解什么是水印。水印是图片处理中的一个常见概念,...

    给图片加水印

    VB(Visual Basic)是一种由微软开发的编程环境,它提供了简单易用的图形用户界面(GUI)创建工具和丰富的功能,使得创建给图片加水印的小程序变得容易。下面我们将深入探讨如何使用VB来实现这个功能,以及涉及到的...

    winform 图片加水印文字和水印图片

    总的来说,这个WinForm应用提供了一个方便的工具,可以对图片进行多种操作,如加水印(文字和图片)、等比例缩放和压缩,这对于日常需要处理图片的工作非常实用。通过理解并应用GDI+的图形处理技术,开发者可以...

    java图片加水印(适应铺满)

    开发一个项目,需要用到图片加水印的功能,这里考虑使用后台加水印,在上传的时候或者回显到页面时候,取图片文件的流数据,进行加水印在返回流数据就行了,非常简单,不懂可以问我

    给图片加水印 批量给图片加水印

    "给图片加水印 批量给图片加水印"这个主题涉及到图像处理技术,特别是批量处理方面,这对于摄影师、设计师或者内容创作者来说非常重要。下面我们将详细探讨如何实现这一功能,以及涉及到的相关技术。 首先,我们要...

    批量给图片加水印

    批量给图片加水印就是其中一种高效的工作方式,它可以确保您的原创作品得到保护,防止被他人盗用。以下是一些关于“批量给图片加水印”的关键知识点: 1. **水印**:水印是一种视觉标记,通常用于在图像上添加版权...

    pb给图片加水印的方法

    5. **计算水印位置**:根据图片大小和水印大小,确定水印在图片上的合适位置,通常会选择一个角落或居中。 6. **绘制水印**:使用Graphics对象的DrawString方法,将水印文本绘制到图片上。 7. **保存修改后的图片*...

    给一张图片加 水印(源代码)

    标签“给图片加水印”、“水印”和“加水印”进一步确认了我们讨论的核心内容。 在给图片加水印的过程中,通常涉及以下关键技术点: 1. 图像处理库:实现这一功能首先需要一个图像处理库,如Python中的Pillow库,...

    delphi实现给图片加水印2用ImageEn控件

    ### Delphi 实现给图片添加水印:使用 ImageEn 控件 #### 背景介绍 在 Delphi 开发环境中,实现对图像处理的需求时,经常会遇到需要为图片添加水印的情况。添加水印不仅可以保护图片版权,还能提高品牌识别度。本文...

    批量给图片加水印软件

    批量给图片加水印的功能能够大大提高工作效率,保护版权,或者为个人或企业品牌做宣传。下面我们将详细探讨批量给图片加水印的相关知识点。 一、什么是水印 水印通常是指在图片上添加的一种半透明或不透明的标识,...

    Flex_给图片加水印

    在给图片加水印时,我们需要用到ActionScript的位图操作类,如`flash.display.BitmapData`和`flash.geom.Matrix`。 2. **BitmapData对象**: 这是ActionScript中用于处理位图图像的核心类。我们可以创建一个`...

    在线给图片加水印-照片上添加文字工具源码分享

    在线图片加水印,canvas加水印,在线给图片加水印、照片上添加文字,通过前端canvas给你的证件加上水印,防止证件被盗。 演示地址:http://watermark.dxcweb.com/

    QT给图片加水印(pro工程+代码)

    QT给图片加水印是一种常见的图像处理操作,用于在图片上添加标识或版权信息,防止未经授权的使用。本文将深入探讨如何使用Qt框架实现这一功能,包括必要的编程知识和步骤。 首先,Qt是一个跨平台的应用程序开发框架...

    图片加水印小工具绿色版

    【图片加水印小工具绿色版】是一款便捷的软件,专为用户设计,用于在图片上添加水印,以保护版权或进行个性化定制。这款工具因其便携式特性,无需安装即可直接运行,大大简化了用户的操作流程。下面将详细介绍这款...

    带水印的图片给图片加水印

    在IT行业中,为图片添加水印是一项常见的任务,主要用于保护版权、标识出处或者增强视觉效果。这个主题涉及到图像处理和编程技术,特别是Python语言中的PIL(Python Imaging Library)库,它提供了丰富的图像操作...

    易优批量图片加水印插件

    易优批量图片加水印插件是一款针对易优CMS(EyouCMS)设计的专业插件,主要用于提升网站的用户体验和优化网页加载速度。在互联网环境中,网页加载速度是影响用户体验的关键因素之一,尤其是当页面中包含大量图片时,...

    asp上传加水印组件

    3. 原图保留:除了加水印的图片外,组件还保留了原始上传的图片,用户可以根据需要选择查看原图或带有水印的图片。 4. AspJpeg组件:AspJpeg是一个常用的ASP图像处理库,用于读取、写入、修改和显示JPEG图像。在ASP...

Global site tag (gtag.js) - Google Analytics