Saturday, July 28, 2012

groovyで立体的な星を描画する

groovyで立体的な星を描画するには、以下のコードを実行します。
@Grab(group='com.jhlabs', module='filters', version='2.0.235')
@Grab(group='org.codehaus.griffon', module='jsilhouette-geom', version='0.4')
import java.awt.*
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 radius1 = 100
def radius2 = 50
def angle = 0
def star = new Star(img.getWidth()/2, img.getHeight()/2,
  radius1, radius2, 5, angle
)
gr.setColor(new Color((int)0xeedd00))
gr.fill(star)
gr.dispose()

def lc = new LinearColormap(0xeedd00, 0xffffff)
def sf = new ShapeFilter()
sf.setColormap(lc)
img = sf.filter(img, null)

ImageIO.write(img, "png", new File("drawstar2.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 = new BufferedImage(
    200, 200, BufferedImage.TYPE_INT_ARGB
)
CheckFilter cf = new CheckFilter()
// 前景色
cf.setForeground((int)0xffffffff)
// 背景色
cf.setBackground((int)0xffccddff)
// xサイズ
cf.setXScale(16)
// yサイズ
cf.setYScale(16)
// あいまいさ
cf.setFuzziness(20)
// 角度
cf.setAngle((float)45f/180f*ImageMath.PI)

img = cf.filter(img, null)

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


出力画像


動作環境
groovy 1.8.6, JDK7 update4

groovyで画像にストライプ枠をつける

groovyで画像にストライプ枠をつけるには、以下のコードを実行します。
import java.awt.*
import java.awt.image.*
import java.awt.geom.*
import java.io.*
import javax.imageio.*

// ストライプ枠を描画する
def img = ImageIO.read(new File("sf2.jpg"))

def bwidth = 10

def img2 = new BufferedImage(
  img.getWidth()+bwidth*2, img.getHeight()+bwidth*2, 
  BufferedImage.TYPE_INT_ARGB
)
def gr = img2.createGraphics()
gr.setRenderingHint(
  RenderingHints.KEY_ANTIALIASING,
  RenderingHints.VALUE_ANTIALIAS_ON
)
def dx = 200
def linewidth = 16
def interval = 44

gr.setColor(new Color((int)0x26261E))
gr.fillRect(0, 0, img2.getWidth(), img2.getHeight())

gr.setStroke(new BasicStroke(linewidth))
gr.setColor(new Color((int)0xffc92c))

for(int lx=-dx;lx<(img2.getWidth());lx+=interval){
  gr.drawLine(lx, 0, lx+dx, img2.getHeight())
}
gr.drawImage(img, bwidth, bwidth, null)
gr.dispose()

ImageIO.write(img2, "png", new File("stripeborder.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)0xff8793))
def path = new Path2D.Double()

// 分割数
def par = 8
// 中心x
def cx = img.getWidth()/2
// 中心y
def cy = img.getHeight()/2
// 制御点半径(大)
def rad1 = 100
// 半径(小)
def rad2 = 40

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

while(dr2<360){
  path.quadTo(
    (cx-Math.cos(2*Math.PI*dr1/360)*rad1),
    (cy-Math.sin(2*Math.PI*dr1/360)*rad1),
    (cx-Math.cos(2*Math.PI*dr2/360)*rad2),
    (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("flower.png"))

出力画像


動作環境
groovy 1.8.6, JDK7 update4

Tuesday, July 24, 2012

groovyで画像に光沢をつける

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

// 画像に光沢をつける
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
)
GradientPaint gp = new GradientPaint(
  0, 0,
  new Color(0xff, 0xff, 0xff, 0xc0),
  0, (int)img.getHeight()*2/3,
  new Color(0xff, 0xff, 0xff, 0x00)
)
gr.setPaint(gp)
def path = new Path2D.Double()
path.moveTo(img.getWidth(), 0)
path.lineTo((int)img.getWidth()*2/3, 0)
path.lineTo(img.getWidth(), (int)img.getHeight()*2/3)
gr.fill(path)
gr.dispose()

// 明るさを75% 
def ctf = new ContrastFilter()
ctf.setBrightness(0.75f)
img = ctf.filter(img, null)

gr = img.createGraphics()
gr.drawImage(img2,0,0,null)
gr.dispose()

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


元画像

出力画像


動作環境
groovy 1.8.6, JDK7 update4

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