透過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に書き出したらハーフトーンが出て酷かったからメモ