日記

Scalaで簡単な画像処理 [プログラム関係]

昨日のドット絵塗り絵会のあとに、二人の方にドット絵添削していただいたので
見比べるのが便利な用に、画像をくっつけてパレットも表示するような
アプリケーションを最近勉強してるScalaという言語で書いてみました。

ファイル複数を引数にすると、

こんなのができる。

適当に書いたソースコード。
型推論のおかげで、長ったらしいBufferedImageとかいちいち記述しなくていいのが便利。

import java.io.File
import javax.imageio.ImageIO
import java.awt.Color
import java.awt.image.BufferedImage
import java.awt.image.IndexColorModel

val PALETTE_CELL_SIZE = 3
val PALETTE_SIZE = PALETTE_CELL_SIZE * 16


if(args.length < 2)
{
  println("usage: scala unite.scala dist_image src_image...")
  exit
}

val images = args.tail.map(a => ImageIO.read(new File(a)))

val width = images.map(a => a.getWidth).reduceLeft((a, b) => a.max(b)) + 
PALETTE_SIZE
val height = images.map(a => a.getHeight.max(PALETTE_SIZE))
.reduceLeft((a, b) => a + b).max(PALETTE_SIZE)

val resultImage = new BufferedImage(width, height, 
BufferedImage.TYPE_INT_ARGB)

var y = 0
val g2d = resultImage.createGraphics
for (image <- images)
{
  g2d.drawImage(image, 0, y, null)

  val palette = image.getColorModel
  if (palette.isInstanceOf[IndexColorModel])
  {
    for (cy <- 0 to 16)
      for (cx <- 0 to 16)
      {
        g2d.setColor(new Color(palette.getRGB(cx+cy*16)))
        g2d.fillRect(width - PALETTE_SIZE + cx * PALETTE_CELL_SIZE,
                     y + cy * PALETTE_CELL_SIZE, 
                     PALETTE_CELL_SIZE, PALETTE_CELL_SIZE)
      }
  }
  y += image.getHeight.max(PALETTE_SIZE)
}
g2d.dispose
ImageIO.write(resultImage, "png", new File(args(0)))

at 2011-5-30 0:25 | Comment(0)
名前: 削除パス: 非公開
URL:
添付:(jpg,gif,png,200KBまで)

 
required 0.0350 sec