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

groovyで画像を回転させる

groovyで画像を回転させるには、以下のコードを実行します。
@Grab(group='com.jhlabs', module='filters', version='2.0.235')
import java.awt.*
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 imga = new BufferedImage(
  img.getWidth(), img.getHeight(), 
  BufferedImage.TYPE_INT_ARGB
)
def gr = imga.createGraphics()
gr.drawImage(img,0,0,null)
gr.dispose()
def rf = new RotateFilter((float)45f/180f*ImageMath.PI, true)
imga = rf.filter(imga, null)

ImageIO.write(imga, "png", new File("rotate.png"))


元画像

出力画像


動作環境
groovy 1.8.6, JDK7 update4

groovyで鱗模様を描画する

groovyで鱗模様を描画するには、以下のコードを実行します。
import java.io.*
import java.awt.*
import java.awt.geom.*
import java.awt.image.*
import javax.imageio.*

// 鱗模様を描画する
def img = new BufferedImage(
    200, 200, BufferedImage.TYPE_INT_RGB
)
def gr = img.createGraphics()
// レンダリングヒントを設定
def rh = new
  RenderingHints(RenderingHints.KEY_ANTIALIASING,
  RenderingHints.VALUE_ANTIALIAS_ON)

rh.put(RenderingHints.KEY_RENDERING,
  RenderingHints.VALUE_RENDER_QUALITY)

gr.setRenderingHints(rh)

def radius = 9
def rc = 0
for(int ly=-radius;ly<img.getHeight();ly+=radius){
  for(int lx=((rc%2==0)?0:-radius);lx<img.getWidth();lx+=radius*2){
    gr.setColor(new Color(0xffffff))
    def rr = new Ellipse2D.Double(
      lx, ly, radius*2, radius*2)
    gr.fill(rr)
    gr.setColor(new Color(0x7799dd))
    gr.setStroke(new BasicStroke(3))
    gr.draw(rr)
  }
  rc++;
}
gr.dispose()

ImageIO.write(img, "png", new File("drawsquama.png"))


出力画像


動作環境
groovy 1.8.6, JDK7 update4

Tuesday, July 03, 2012

groovyで画像上部を半円模様で切り取る

groovyで画像上部を半円模様で切り取るには、以下のコードを実行します。
import java.io.*
import java.awt.*
import java.awt.geom.*
import java.awt.image.*
import javax.imageio.*

// 画像上部を半円模様で切り取る
def img = ImageIO.read(new File("sf2.jpg"))
def img2 = new BufferedImage(
  img.getWidth(), img.getHeight(), BufferedImage.TYPE_INT_ARGB
)
def gr = img2.createGraphics()
gr.setRenderingHint(
  RenderingHints.KEY_ANTIALIASING,
  RenderingHints.VALUE_ANTIALIAS_ON
)
def radius = 20

gr.setColor(new Color(1F, 1F, 1F, 1F))

for(int lx=0;lx<img.getWidth();lx+=radius*2){
  def rr = new Ellipse2D.Double(
    lx, 0, radius*2, radius*2)
  gr.fill(rr)
}
def rect = new Rectangle2D.Double(
  0, radius, img.getWidth(), img.getHeight() - radius)
gr.fill(rect)

// 切り取り 
gr.setComposite(AlphaComposite.SrcIn)
gr.drawImage(img,0,0,null)
gr.dispose()

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


元画像

出力画像


動作環境
groovy 1.8.6, JDK7 update4

Monday, July 02, 2012

groovyで水平方向に半透明グラデーションの点模様を作成する

groovyで水平方向に半透明グラデーションの点模様を作成するには、以下のコードを実行します。
import java.io.*
import java.awt.*
import java.awt.geom.*
import java.awt.image.*
import javax.imageio.*

// 水平方向に半透明グラデーションの点模様を作成する
def img = new BufferedImage(
    200, 200, BufferedImage.TYPE_INT_ARGB
)
def color1 = 0x335599
def interval = 3

def wr = img.getRaster()
def buf = new int[4]

for(int ly=0;ly<wr.getHeight();ly++){
  for(int lx=0;lx<wr.getWidth();lx++){
    if( lx%interval == 0 && ly%interval == 0 ){
      buf[0] = (color1 >> 16) & 0xff
      buf[1] = (color1 >> 8) & 0xff
      buf[2] = color1 & 0xff
      buf[3] = 255-Math.sin(Math.PI*lx/img.getWidth())*255
    } else {
      buf[0] = buf[1] = buf[2] = buf[3] = 0
    }
    wr.setPixel(lx, ly, buf)
  }
}
ImageIO.write(img, "png", new File("hgraddots.png"))


出力画像


動作環境
groovy 1.8.6, JDK7 update4

groovyで画像を十字で塗りつぶした感じに変換する

groovyで画像を十字で塗りつぶした感じに変換するには、以下のコードを実行します。
@Grab(group='com.jhlabs', module='filters', version='2.0.235')
import java.awt.*
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 sf = new SmearFilter()
sf.setShape(SmearFilter.CROSSES)
sf.setDensity(0.9f)
sf.setDistance(7)
sf.setScatter(0.8f)
//sf.setAngle((float)30*ImageMath.PI/180)
img = sf.filter(img, null)

ImageIO.write(img, "png", new File("paintcrosses.png"))


元画像

出力画像


動作環境
groovy 1.8.6, JDK7 update4

Sunday, July 01, 2012

groovyで画像を水平方向に傾ける

groovyで画像を水平方向に傾けるには、以下のコードを実行します。
@Grab(group='com.jhlabs', module='filters', version='2.0.235')
import java.awt.*
import java.awt.image.*
import java.io.*
import javax.imageio.*
import com.jhlabs.composite.*
import com.jhlabs.image.*

class ShearFilter2 extends TransformFilter
{
  float xoffset = 0.0f
  float yoffset = 0.0f
  float dx = 0.0f
  float rx = 0.0f
  float dy = 0.0f
  float ry = 0.0f
  void transformSpace(Rectangle r)
  {
    r.width = (int)r.width+Math.abs(dx)
    rx = dx/r.height
    xoffset = dx>0?-dx:0
    r.height = (int)r.height+Math.abs(dy)
    ry = dy/r.width
    yoffset = dy>0?-dy:0
  }
  void transformInverse(int x, int y, float[] out)
  {
    out[0] = x + xoffset + (y * rx)
    out[1] = y + yoffset + (x * ry)
  }
}

// 画像を水平方向に傾ける
def img = ImageIO.read(new File("sf2.jpg"))
def dx = -20
def imga = new BufferedImage(
  (int)img.getWidth()+Math.abs(dx), img.getHeight(), 
  BufferedImage.TYPE_INT_ARGB
)
def sf = new ShearFilter2()
sf.dx = dx
sf.filter(img, imga)

ImageIO.write(imga, "png", new File("hshear.png"))


元画像

出力画像


動作環境
groovy 1.8.6, JDK7 update4