Sunday, September 23, 2012

pycairoを使用してSVGファイルに直線を描画する

pycairoを使用してSVGファイルに直線を描画するには、以下のコードを実行します。
import cairo
import rsvg

file = file('test1.svg', 'w')
width = 200
height = 200
surface = cairo.SVGSurface(file, width, height)
ctx = cairo.Context(surface)
ctx.set_source_rgb(0xcc/float(0xff), 0xdd/float(0xff), 0xff/float(0xff))
ctx.move_to(0, 0)
ctx.line_to(200, 200)
ctx.stroke()
surface.finish()


出力画像

動作環境
CentOS6.2, python 2.6.6

補足
pycairoでSVGを使用するにはpyrsvgをインストールします。
yum install gnome-python2-rsvg

Saturday, September 22, 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 wr = img.getRaster()

def buf = new int[wr.getNumDataElements()]

def color1 = 0x948E73
def red = (color1 >> 16) & 0xff
def green = (color1 >> 8) & 0xff
def blue = color1 & 0xff

for(int ly=0;ly<wr.getHeight();ly++){
  for(int lx=0;lx<wr.getWidth();lx++){
    wr.getPixel(lx, ly, buf)
    def mono = (buf[0] * 77 + buf[1] * 151 + buf[2] * 28) >> 8;
    buf[0] = (int)(mono * red / (ly % 2 + 1) / 255)
    buf[1] = (int)(mono * green / (ly % 2 + 1) / 255)
    buf[2] = (int)(mono * blue / (ly % 2 + 1) / 255)
    wr.setPixel(lx, ly, buf)
  }
}

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("paintfabric.png"))


元画像

出力画像


動作環境
groovy 1.8.6, JDK7 update4

Saturday, September 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 = new BufferedImage(
    200, 200, BufferedImage.TYPE_INT_ARGB
)
def pf = new PlasmaFilter()
// 乱れを設定する(0-10)
pf.setTurbulence(1.1f)
// seed設定
pf.setSeed((int)(Math.random()*1000))
img = pf.filter(img, null)

def basecolor = 0x948E73

def lc = new LinearColormap((int)(0xFF000000 | basecolor), (int)basecolor)
LookupFilter lf = new LookupFilter(lc)
img = lf.filter(img, null)

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


出力画像


動作環境
groovy 1.8.6, JDK7 update4

Friday, September 07, 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 wr = img.getRaster()

buf = new int[wr.getNumDataElements()]

def color1 = 0xBBBF45
def red = (color1 >> 16) & 0xff
def green = (color1 >> 8) & 0xff
def blue = color1 & 0xff

for(int ly=0;ly<wr.getHeight();ly++){
  for(int lx=0;lx<wr.getWidth();lx++){
    wr.getPixel(lx, ly, buf)
    def mono = (buf[0] * 77 + buf[1] * 151 + buf[2] * 28) >> 8;
    buf[0] = (int)(mono * red / 255)
    buf[1] = (int)(mono * green / 255)
    buf[2] = (int)(mono * blue / 255)
    wr.setPixel(lx, ly, buf)
  }
}

def bf = new BlockFilter()
bf.setBlockSize(5)
img = bf.filter(img, null)

def df = new DiffuseFilter()
df.setScale(3)
img = df.filter(img, null)

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


元画像

出力画像


動作環境
groovy 1.8.6, JDK7 update4

Tuesday, September 04, 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 tilesize = 16
def padding = 2
def interval = tilesize + padding*2
Color color1 = new Color((int)0x5F6273)
Color color2 = new Color((int)0xA4ABBF)

def gr = img.createGraphics()
def wr = img.getRaster()
def buf = new int[4]
buf[0] = color2.red
buf[1] = color2.green
buf[2] = color2.blue
buf[3] = 255
for(int ly=0;ly<img.getHeight();ly+=interval){
  for(int lx=0;lx<img.getWidth();lx+=interval){
    if( ((int)(ly/interval+lx/interval))%2 == 0 ){
      gr.setColor(color1)
      gr.fillRect(lx+padding, ly+padding, tilesize, tilesize)
    } else {
      for(int oy=0;oy<tilesize;oy++){
        for(int ox=0;ox<tilesize;ox++){
          if( (ox+oy)%2 == 0 ){
            wr.setPixel(lx+ox+padding, ly+oy+padding, buf)
          }
        }
      }
    }
  }
}
gr.dispose()

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


出力画像


動作環境
groovy 1.8.6, JDK7 update4

Friday, August 31, 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 tilesize = 16
def padding = 2
def interval = tilesize + padding*2
Color color1 = new Color((int)0xF0E4C5)
Color color2 = new Color((int)0xD6C28F)

def gr = img.createGraphics()
for(int ly=0;ly<img.getHeight();ly+=interval){
  for(int lx=0;lx<img.getWidth();lx+=interval){
    if( ((int)(ly/interval+lx/interval))%2 == 0 ){
      gr.setColor(color1)
    } else {
      gr.setColor(color2)
    }
    gr.fillRect(lx+padding, ly+padding, tilesize, tilesize)
  }
}
gr.dispose()

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


出力画像


動作環境
groovy 1.8.6, JDK7 update4

Sunday, August 26, 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 img2 = new BufferedImage(
  img.getWidth(), img.getHeight(), BufferedImage.TYPE_INT_ARGB
)

def wr = img2.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)
    buf[0] = buf[1] = buf[2] = 255
    buf[3] = (int)(Math.random()*0.2*255+255*0.6)
    wr.setPixel(lx, ly, buf)
  }
}

def gf = new GaussianFilter()
gf.setRadius(5f)
img = gf.filter(img, null)
gf.setRadius(1f)
img2 = gf.filter(img2, null)

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

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


元画像

出力画像


動作環境
groovy 1.8.6, JDK7 update4

Monday, August 20, 2012

groovyでぼかした水玉模様を描画する

groovyでぼかした水玉模様を描画するには、以下のコードを実行します。
@Grab(group='com.jhlabs', module='filters', version='2.0.235')
import java.io.*
import java.awt.*
import java.awt.geom.*
import java.awt.image.*
import javax.imageio.*
import com.jhlabs.image.*

// ぼかした水玉模様を描画する 
def img = new BufferedImage(
    200, 200, BufferedImage.TYPE_INT_RGB
)
def gr = img.createGraphics()

def radius = 9
def padding = 4
def interval = radius*2 + padding

gr.setColor(new Color(0xffffff))
def rect = new Rectangle2D.Double(
    0.0, 0.0, img.getWidth(), img.getHeight())
gr.fill(rect)

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

def gf = new GaussianFilter()
gf.setRadius(5f)
img = gf.filter(img, null)

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


出力画像


動作環境
groovy 1.8.6, JDK7 update4

Friday, August 17, 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 linelength = 16
def lineinterval = 2;
def padding = 2
Color color1 = new Color((int)0x1C425C)

def interval = linelength + padding*2
def gr = img.createGraphics()
gr.setColor(color1)
for(int ly=0;ly<img.getHeight();ly+=interval){
  def cc=((int)ly/interval)%2==0?0:1
  for(int lx=0;lx<img.getWidth();lx+=interval){
    if( cc%2 == 0 ){
      for(int py=0;py<=linelength;py+=lineinterval){
        gr.drawLine(lx+padding, ly+py+padding, lx+padding+linelength, ly+py+padding)
      }
    } else {
      for(int px=0;px<=linelength;px+=lineinterval){
        gr.drawLine(lx+px+padding, ly+padding, lx+px+padding, ly+padding+linelength)
      }
    }
    cc++
  }
}

ImageIO.write(img, "png", new File("drawhvlines.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.*

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 dy = 30

// 画像を折り曲げたように加工する
def img = ImageIO.read(new File("sf2.jpg"))
// 右半分を切り取り
def img2 = img.getSubimage((int)img.getWidth()/2, 0, 
  (int)img.getWidth()/2, img.getHeight());
def imga = new BufferedImage(
  (int)img2.getWidth(), img2.getHeight()+Math.abs(dy), 
  BufferedImage.TYPE_INT_ARGB
)
// 左半分を切り取り
def img3 = img.getSubimage(0, 0, 
  (int)img.getWidth()/2, img.getHeight());

// 明るさを140% 
def ctf = new ContrastFilter()
ctf.setBrightness(1.4f)
img2 = ctf.filter(img2, null)

// 傾ける
def sf = new ShearFilter2()
sf.dy = dy
sf.filter(img2, imga)

def imga2 = new BufferedImage(
  (int)img.getWidth(), imga.getHeight(), 
  BufferedImage.TYPE_INT_ARGB
)

gr = imga2.createGraphics()
gr.drawImage(img3,0,dy,null)
gr.drawImage(imga, img3.getWidth(),0,null)

ImageIO.write(imga2, "png", new File("fold.png"))


元画像

出力画像


動作環境
groovy 1.8.6, JDK7 update4