Saturday, July 21, 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 gr = img.createGraphics()
gr.setRenderingHint(
  RenderingHints.KEY_ANTIALIASING,
  RenderingHints.VALUE_ANTIALIAS_ON
)
gr.setColor(new Color((int)0xFFF48580))
def path = new Path2D.Double()

// 分割数
def par = 32
// 中心x
def cx = img.getWidth()/2
// 中心y
def cy = img.getHeight()/2
// 半径(大)
def rad1 = 90
// 半径(小)
def rad2 = 75

def dr1=0
def dr2=360/(par*2)
path.moveTo(
  (int)(cx-Math.cos(2*Math.PI*dr1/360)*rad1),
  (int)(cy-Math.sin(2*Math.PI*dr1/360)*rad1)
)
path.lineTo(
  (int)(cx-Math.cos(2*Math.PI*dr2/360)*rad2),
  (int)(cy-Math.sin(2*Math.PI*dr2/360)*rad2)
)
dr1 += 360/par
dr2 += 360/par

while(dr2<360){
  path.lineTo(
    (int)(cx-Math.cos(2*Math.PI*dr1/360)*rad1),
    (int)(cy-Math.sin(2*Math.PI*dr1/360)*rad1)
  )
  path.lineTo(
    (int)(cx-Math.cos(2*Math.PI*dr2/360)*rad2),
    (int)(cy-Math.sin(2*Math.PI*dr2/360)*rad2)
  )

  dr1 += 360/par
  dr2 += 360/par
}
gr.fill(path)
gr.dispose()

ImageIO.write(img, "png", new File("drawbadge.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_ARGB
)
def gr = img.createGraphics()
gr.setRenderingHint(
  RenderingHints.KEY_ANTIALIASING,
  RenderingHints.VALUE_ANTIALIAS_ON
)
gr.setColor(new Color((int)0xff8899ee))
def path = new Path2D.Double()

// 分割数
def par = 16
// 半径
def rad1 = 90
// 描画する円の半径
def rad2 = 10

def dr=0
while(dr<360){
  def cx = img.getWidth()/2 + Math.cos(2*Math.PI*dr/360)*rad1 -rad2
  def cy = img.getHeight()/2 + Math.sin(2*Math.PI*dr/360)*rad1 -rad2
  def ellipse = new Ellipse2D.Double(cx, cy, rad2*2, rad2*2)
  gr.fill(ellipse)
  dr += 360/par
}
gr.fill(path)
gr.dispose()

ImageIO.write(img, "png", new File("circles.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.geom.*
import java.awt.image.*
import java.io.*
import javax.imageio.*
import org.codehaus.griffon.jsilhouette.geom.*

// ルーローの三角形を描画する
def img = new BufferedImage(
    200, 200, BufferedImage.TYPE_INT_ARGB
)
def gr = img.createGraphics()
gr.setRenderingHint(
  RenderingHints.KEY_ANTIALIASING,
  RenderingHints.VALUE_ANTIALIAS_ON
)
gr.setColor(new Color((int)0xFF92ADC2))
def minlen = img.getWidth()>img.getHeight()?img.getHeight():img.getWidth()
def reuleaux = new ReuleauxTriangle(0, (int)minlen/2*Math.sqrt(3), 
  minlen, 0, true)
gr.fill(reuleaux)
gr.dispose()

ImageIO.write(img, "png", new File("drawreuleaux.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 = ImageIO.read(new File("sf2.jpg"))

def edge = 4
def radius = 20
// 切り取り用角丸四角の画像を作成 
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
)
gr.setColor(new Color(1F, 1F, 1F, 1F))
def rr = new RoundRectangle2D.Double(
    edge, edge, img.getWidth()-edge*2, img.getHeight()-edge*2, radius*2, radius*2)
gr.fill(rr)
// 切り取り 
gr.setComposite(AlphaComposite.SrcIn)
gr.drawImage(img,0,0,null)
gr.dispose()

// 枠用の角丸四角を作成
def img3 = new BufferedImage(
  img.getWidth(), img.getHeight(), BufferedImage.TYPE_INT_ARGB
)
gr = img3.createGraphics()
gr.setRenderingHint(
  RenderingHints.KEY_ANTIALIASING,
  RenderingHints.VALUE_ANTIALIAS_ON
)
gr.setColor(new Color((int)0xBFB8A3))
def rr2 = new RoundRectangle2D.Double(
    0, 0, img.getWidth(), img.getHeight(), radius*2, radius*2)
gr.fill(rr2)
gr.drawImage(img2,0,0,null)
gr.dispose()


ImageIO.write(img3, "png", new File("roundrectedge.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.geom.*
import java.awt.image.*
import java.io.*
import javax.imageio.*
import com.jhlabs.composite.*
import com.jhlabs.image.*
import org.codehaus.griffon.jsilhouette.geom.*

// 吹き出しを描画する
def img = new BufferedImage(
    200, 200, BufferedImage.TYPE_INT_ARGB
)
def gr = img.createGraphics()
gr.setRenderingHint(
  RenderingHints.KEY_ANTIALIASING,
  RenderingHints.VALUE_ANTIALIAS_ON
)
def arc = 40
def tabheight = 20
gr.setColor(new Color((int)0xFFBFB8A3))
def balloon = new Balloon(0, 0, img.getWidth(), img.getHeight()-tabheight, arc,
  tabheight*2, tabheight, Balloon.TAB_AT_BOTTOM, 0.5f //, Balloon.ANGLE_AT_START
)
gr.fill(balloon)
gr.dispose()

ImageIO.write(img, "png", new File("drawballoon.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 cf = new ContourFilter()
cf.setLevels(10)
cf.setScale(1f)
cf.setOffset(0f)
img = cf.filter(img, null)

ImageIO.write(img, "png", new File("contour.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 grf = new GrayscaleFilter()
img = grf.filter(img, null)
// エッジ抽出
def ef = new EdgeFilter()
img = ef.filter(img, null)

def lc = new LinearColormap((int)0xFFFFFF10, (int)0xFFF24405)
LookupFilter lf = new LookupFilter(lc)
img = lf.filter(img, null)

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


元画像

出力画像


動作環境
groovy 1.8.6, JDK7 update4

Tuesday, July 17, 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.*

// 指定色と透明色で2値化する
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 threshold = 127
def white = (int)0x00000000
def black = (int)0xff1C425C

def wr = imga.getRaster()
def buf = new int[4]
for(int ly=0;ly<wr.getHeight();ly++){
  for(int lx=0;lx<wr.getWidth();lx++){
    wr.getPixel(lx, ly, buf)

    if( PixelUtils.brightness((buf[0]<<16)+(buf[1]<<8)+buf[2]) > threshold  ){
      buf[0] = (white >> 16) & 0xff
      buf[1] = (white >> 8) & 0xff
      buf[2] = white & 0xff
      buf[3] = (white >> 24) & 0xff
    } else {
      buf[0] = (black >> 16) & 0xff
      buf[1] = (black >> 8) & 0xff
      buf[2] = black & 0xff
      buf[3] = (black >> 24) & 0xff
    }

    wr.setPixel(lx, ly, buf)
  }
}
ImageIO.write(imga, "png", new File("threshold3.png"))


元画像

出力画像


動作環境
groovy 1.8.6, JDK7 update4

Sunday, July 15, 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.*

// 画像の大きさを変更してタイル配置する
def img = ImageIO.read(new File("sf2.jpg"))
def ratio = 0.25f
def newwidth = (int)img.getWidth()*ratio
def newheight = (int)img.getHeight()*ratio
def imga = new BufferedImage(
    newwidth, newheight, BufferedImage.TYPE_INT_ARGB
)
def sf = new ScaleFilter(newwidth, newheight)
sf.filter(img, imga)

def tif = new TileImageFilter((int)newwidth*(1/ratio), (int)newheight*(1/ratio))
imga = tif.filter(imga, null)

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

元画像

出力画像


動作環境
groovy 1.8.6, JDK7 update4