IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    像黑客一样处理图片–水印篇

    cfylee发表于 2014-12-01 06:32:33
    love 0

    最近新入了一台单反相机,尼康的D7000, 是一台很赞的机器,摄影也是我暂时拟定的几个主要的技能树之一,分别是编程,摄影,电子制作,无线电和骑车。如果这是一篇介绍使用ps给照片加水印的文章那就太没意思啦,网上能找到很多类似的教程和文章,如果您想学习使用ps来给文章添加睡应的话,很抱歉,您可以关闭该网页了,本文的主角是gimp(GNU Image Manipulation Program),一个开源的自由图像编辑软件,它功能强大之处在于可定制性,您可以根据自己的需要来添加自己所需要的功能,可定制性也是我喜爱自由软件的原因之一,我选择gimp的还有一个主要原因是我是linux的狂热用户,linux下没有ps的,而我也不想在自己的电脑上使用盗版软件,我工作就是编写软件所以对软件的版权也很看重,相信ps这样的软件也是一班屌丝程序员辛苦编写出来的,屌丝何苦为难屌丝呢:)

    安装gimp

    本文主要介绍gimp在linux下的是使用,所以以下的所有步骤均是在了linux下的操作,windows用户请自行查阅相应的安装步骤,我所使用的linux是opensuse12.3,如果是其他发行版的话使用其相应的软件包管理器安装就可以了,大多是的发行版软件源中相信都添加了该软件,安装非常的容易在opensuse中的操作如下:

    sudo zypper install gimp

    水印插件的编写及使用

    接下来我将介绍如何编写一个gimp的插件,这里我使用的是bumpmap效果来添加水印,gimp可以支持三中语言的脚本,分别是python, perl和scheme,不过gimp的编写者似乎对python和perl并不怎么关心相关的文档已经特别陈旧了,scheme的文档似乎更多一些,scheme是一种函数式编程语言,是一种高端大气上档次的lisp方言,lisp语言可是唯一能理解上帝的的语言啊!!!! 当然啦对于这种高大上的语言我自然是不懂的,所以参考了下别人的代码(娇羞), 代码如下:

    (define (bumped-watermark filename fullname)
    (let* ((img (car (gimp-file-load RUN-NONINTERACTIVE filename fullname)))
    (drawable (car (gimp-image-active-drawable img)))
    (layer (car (gimp-layer-new img 1200 800  //设置输入分辨率
    RGB "Water mark layer" 100 NORMAL))))
    (gimp-image-add-layer img layer 0)
    (gimp-edit-fill layer WHITE-FILL)
    (let* ((drawable(car (gimp-image-active-drawable img)))
    (text-float(car (gimp-text-fontname img drawable
    1000 750                                //水印位置
    "@cfylee"                               //水印字符
    0 1 20 0
    "Sans"))))                              //水印字体
    (gimp-floating-sel-anchor text-float))
    (let* ((watermark (car (gimp-image-active-drawable img))))
    (plug-in-bump-map RUN_NONINTERACTIVE img drawable watermark
    135 45 0 0 0 0 1 0 LINEAR))
    (gimp-image-remove-layer img layer)
    (gimp-file-save RUN_NONINTERACTIVE img drawable
    fullname filename)
    
    ;Finally register our script with script-fu.
    (script-fu-register "bunped-watermark"
    "Bunped watermark"
    "Add Bumpered watermark to a given image"
    "cfylee"
    "cfylee"
    "2013-6-12"
    ""
    SF-STRING "File name:" ""
    SF-STRING "Full file path name:" "")
    (script-fu-menu-register "bumped-watermark" "~/.gimpplugins")

    将上面的代码保存成scheme源文件,取名watermark.scm,放到~/.gimp-2.8/scripts目录中,打开gimp2.8在工具栏中找到filters->Scripts-Fu->refresh script 完成后我们编写的插件就完成安装了,使用方法,在shell中输入以下命令:

    gimp -c -i -d -b '(bumped-watermark "'$file'" "'$ddir'/'$file'")' -b '(gimp-quit 0)'

    将’$file’替换成源图片的路径,’$addr’/’$file’替换成目标图片的路径.

    有关scheme和Script-Fu插件编写的信息参考:http://www.gimp.org/tutorials/Basic_Scheme/
    关于bumpmap插件的使用效果,参考:http://www.gimp.org/tutorials/The_Basics/
    关于Script-Fu的具体使用参考:http://www.gimp.org/tutorials/Basic_Scheme/

    批量处理图片

    如果每次都一张一张的处理图片的话一定会让人崩溃的,作为一个懒人这种无聊的工作自然是要交给计算机来做,根据unix编程原则don’t repeat yourself, 编写了下面的shell脚本来完成批量处理的工作,忽然想起上高中时老师说我基因都是懒的,不禁婉儿一笑,懒有什么不好?代码如下:

    #!/bin/env bash
    sdir = "~/Pictures/xx"      //替换成源图片路径
    ddir = "~/Pictures/xx.done" //替换成目标图片路径
    cd $sdir
    mkdir $ddir
    for file in *
    do
        if [ -f "$file"  -a  -n $(ls $file | grep '.jpg') ]
    then
    echo "Adding watermark to picture:$file.."
    if [ -f "$file"  -a  -n $(ls $file | grep '.jpg') ]
    fi
    done
    echo "Done"

    参考文档

    http://www.gimp.org/docs/

    http://www.gimp.org/tutorials/Basic_Perl/

    http://imagic.weizmann.ac.il/~dov/gimp/perl-tut-2.0/

    http://www.gimp.org/docs/python/index.html



沪ICP备19023445号-2号
友情链接