Areaの画像

English

UIng::Imageを作成して保持し、draw内でcontext.draw_imageを呼びます。画像を描画のたびに作り直しません。

画像の作成と描画

API 用途
Image.new(width, height) 論理サイズを指定して空の画像を作る
image.size / image.width / image.height ポイント単位の論理サイズを取得する
image.append(pixels, pixel_width, pixel_height, byte_stride) premultiplied RGBAピクセルを追加する
draw_image(image, x, y, width, height) 指定した矩形へ描画する
image.free 不要になった画像を解放する

draw_imageのwidthとheightは有限かつ正の値でなければなりません。渡した値が表示サイズになるため、縦横比は呼び出し側で保ちます。

handler.draw do |_area, params|
  params.context.draw_image(image, 24, 24, 128, 128)
end

構築ブロック

Image.newでは、ブロック内で画像の表現を追加できます。

image = UIng::Image.new(16, 16) do
  append(pixels_1x, 16, 16, 64)
  append(pixels_2x, 32, 32, 128)
end

ImageBuffer.newも、固定解像度のバッファを作成して初期ピクセルを設定するブロックを受け取れます。CrImage画像を渡すImageBuffer.new(source)でも同じ形式が使えます。

buffer = UIng::ImageBuffer.new(1, 1) do
  update(Bytes[255, 0, 0, 255])
end

どちらも|image|や|buffer|で生成したオブジェクトを受け取れます。戻り値はブロックの結果によらずそのオブジェクトです。設定ブロックが例外終了すると解放します。正常終了後は呼び出し側が所有し、不要になったらfreeします。ImageBuffer.openは通常の引数渡しで、ブロック終了時に解放する形式です。

ファイルから読み込む

require "uing/crimage"を使うと、ファイルまたはCrImageの画像からUIng::Imageを作れます。

require "uing/crimage"

image = UIng::Image.from_file("logo.png")

window.on_closing do
  image.free
  UIng.quit
  true
end
API 用途
UIng::Image.from_file(path) ファイルを読み込み、ネイティブ画像へ変換する
source.to_uing_image CrImage::Imageをネイティブ画像へ変換する
image.append(source) 同じ画像へCrImageの表現を追加する

高解像度の表現を追加する場合は、同じImageにappendします。作成したImageは呼び出し側が所有し、不要になった時点でfreeします。

area_draw_image.crは画像の描画と拡大縮小の例です。