透過PNGを合成してGIFを吐き出してみる(FreeImageNet) 

FreeImageNetを拾ってくる
Site : The FreeImage Project
http://freeimage.sourceforge.net/download.html


展開して Bin ディレクトリに
FreeImageNET.dll
FreeImage.dll
を突っ込む


とりあえずページ先頭に以下のコードを追加

<%@ Assembly Name="FreeImageNet" %>

合成処理を用意

'/// infile で指定した画像を Drawing.Graphicsに描画
Public Function ImgOverWrite(byval infile as string, _
                             byref g as Drawing.Graphics)

    '/// 画像ファイルのロック防止の為、ReadでFileStreamを作成
    Dim fs as New IO.FileStream(infile, IO.FileMode.Open, IO.FileAccess.Read, IO.FileShare.Read)

    '/// 作成したFileStreamからBitmapを作成
    dim bmp As New Drawing.Bitmap(fs)

    '/// Drawing.Graphicsに描画
    g.DrawImage(bmp, 0, 0, bmp.Width, bmp.Height)

    '/// 後処理
    fs.Close()
    fs.Dispose()
    bmp.Dispose()
    	
End Function

画像読み込んで合成してバイナリ吐き出す

'/// 土台となるBitmapを作成(70x150px)
Dim basebmp As New Drawing.Bitmap(70, 150)

'/// 土台BitmapのGraphicsを取得
Dim g as Drawing.Graphics
g = Drawing.Graphics.FromImage(basebmp)

'/// 白で塗りつぶす
g.Clear(Drawing.Color.White)

'/// 土台に画像を上書き
ImgOverWrite("hogehoge.png", g)
ImgOverWrite("fugafuga.png", g)

'/// 出来上がった画像をMemoryStreamに読み込む
Dim ms As New System.IO.MemoryStream
basebmp.save(ms, Drawing.Imaging.ImageFormat.Png)

'/// FreeImageAPIを使ってPNG→GIFに変換
Dim dib As FreeImageAPI.FIBITMAP

'/// GIFを格納するMemoryStream
Dim ms_Gif As Stream.IO.MemoryStream

'/// 前で保存したMemoryStreamからFIBITMAPを作成
dib = FreeImageAPI.FreeImage.CreateFromBitmap(New Drawing.Bitmap(ms))

'/// GifとしてMemoryStreamに吐き出し
FreeImageAPI.FreeImage.SaveToStream(dib, ms_Gif, FreeImageAPI.FREE_IMAGE_FORMAT.FIF_GIF)

'/// ContentTypeをimage/gifに変更して書き出し
Response.Clear()
Response.ContentType = "image/gif"
Response.BinaryWrite(ms_Gif.GetBuffer)

'/// 後始末
ms_Gif.Close()
FreeImageAPI.FreeImage.Unload(dib)
dib.SetNull()

ms.Close()
basebmp.Dispose()

標準のBitmapで合成してGIFに書き出したらハーフトーンが出て酷かったからメモ