Saturday, July 07, 2012

groovyで画像をポラロイド写真風にする

groovyで画像をポラロイド写真風にするには、以下のコードを実行します。
@Grab(group='com.jhlabs', module='filters', version='2.0.235')
import java.awt.*
import java.awt.geom.*
import java.awt.image.*
import java.io.*
import javax.imageio.*
import com.jhlabs.composite.*
import com.jhlabs.image.*

// 画像をポラロイド写真風にする
def img = ImageIO.read(new File("sf2.jpg"))

def bwidth = 10
def ewidth = 1
def wavelength = 3
def margin = 10

// 枠を描画
def img2 = new BufferedImage(
  img.getWidth()+(bwidth+ewidth)*2, img.getHeight()+(bwidth+ewidth)*2, 
  BufferedImage.TYPE_INT_ARGB
)
def gr = img2.createGraphics()
gr.setColor(new Color((int)0xff808080))
def edge = new Rectangle2D.Double(
    0.0, 0.0, img2.getWidth(), img2.getHeight())
gr.fill(edge)

gr.setColor(new Color((int)0xfffffff0))
def rect = new Rectangle2D.Double(
    ewidth, ewidth, img2.getWidth()-ewidth*2, img2.getHeight()-ewidth*2)
gr.fill(rect)
gr.drawImage(img, ewidth+bwidth, ewidth+bwidth, null)
gr.dispose()

// たわませる
def rf = new RippleFilter()
rf.setXAmplitude((float)wavelength)
rf.setXWavelength((float)img2.getHeight()/3)
img2 = rf.filter(img2, null)

// 余白削除
img = new BufferedImage(
  img2.getWidth()-wavelength, img2.getHeight(), 
  BufferedImage.TYPE_INT_ARGB
)
gr = img.createGraphics()
gr.drawImage(img2, 0, 0, null)
gr.dispose()

// 回転
def rof = new RotateFilter((float)10f/180f*ImageMath.PI, true)
img = rof.filter(img, null)

// マージン追加
img2 = new BufferedImage(
  img.getWidth()+margin*2, img.getHeight()+margin*2, 
  BufferedImage.TYPE_INT_ARGB
)
gr = img2.createGraphics()
gr.drawImage(img, margin, margin, null)
gr.dispose()

// 影付け
def sf = new ShadowFilter()
// 半径
sf.setRadius(7f)
// 透明度
sf.setOpacity(0.9f)
// 角度
sf.setAngle((float)300f/180f*ImageMath.PI)
// 距離
sf.setDistance(5f)
// 影の色
sf.setShadowColor((int)0xff202020)
// 影のマージン
sf.setAddMargins(false)
// 影のみにするか
sf.setShadowOnly(false)
img2 = sf.filter(img2, null)

ImageIO.write(img2, "png", new File("polaroid.png"))


元画像

出力画像


動作環境
groovy 1.8.6, JDK7 update4

No comments: