人気ブログランキング | 話題のタグを見る
Bitmapオブジェクト
ASP.NETプログラミング本格入門によると、ASP.NETを利用して、プログラム上で画像を作成し、それをJPEG画像として、.aspxのコンテンツとして返す方法が載っていたので、それを試してみた。

とりあえず、記載されているとおりに入力して動かしてみる。
当然ながら動く。

今度は、JPEGファイルを読み込んで、それを表示してみる。

<%@ Page Language="C#" ContentType="image/jpeg" %>
<%@ Import Namespace="System.Drawing" %>
<%@ Import Namespace="System.Drawing.Imaging" %>
<%
// JPEGをそのまま表示
Response.Clear();
Bitmap jpeg = new Bitmap("c:/test.jpg");
jpeg.Save(Response.OutputStream, ImageFormat.Jpeg);
jpeg.Dispose();
Response.End();
%>

出来た出来た。
JPEGファイルを読み込むのは、簡単なようだ。
URIでのパス指定には、対応していないようなので、http://~で始まるURLで得られた画像をASP.NETに読み込むには、ちょっと工夫が必要みたい。
(他のCGIで作成された画像にASP.NETで文字やら線やらをオーバーレイ書き込みするのが目的なので、、、)

しょうがないので、ローカルから読み込んだ画像の上に、何か書いてみる。

<%@ Page Language="C#" ContentType="image/jpeg" %>
<%@ Import Namespace="System.Drawing" %>
<%@ Import Namespace="System.Drawing.Imaging" %>
<%
// JPEGを読み込んでその上に描画する
Response.Clear();
Bitmap jpeg = new Bitmap("c:/test.jpg");
Bitmap bitmap = new Bitmap(jpeg.Width, jpeg.Height, PixelFormat.Format24bppRgb);
for(int y=0; y<jpeg.Height; y++)
{
  for(int x=0; x<jpeg.Width; x++)
  {
    bitmap.SetPixel(x, y, jpeg.GetPixel(x,y));
  }
}
jpeg.Dispose();

Graphics graph = Graphics.FromImage(bitmap);
graph.DrawRectangle(Pens.Blue, 0, 0, bitmap.Width, bitmap.Height);
graph.DrawEllipse(Pens.Red, 10, 10, bitmap.Width -20, bitmap.Height -20);
bitmap.Save(Response.OutputStream, ImageFormat.Jpeg);
graph.Dispose();
bitmap.Dispose();
Response.End();
%>

最初、読み込んだjpegを直にGraphics.FromImage()に渡してみたが、うまく動かなかった。
JPEGファイルが8ビットのグレースケールだったのが原因で、ピクセルフォーマットがパレットカラーだから、ダメだよ。と怒られた。どうやら、Graphicsオブジェクトは、PixelFormat.Format24bppRgbを要求するようだ。
しょうがないので、いろいろ悩んだが、新しいBitmapオブジェクトを作成して、そこにjpegの内容をコピーするようにしようと思った。
が、、、コピーするための方法が見つからない。。。
しょうがないので、今日のところは、ピクセル1つずつ、ループでコピーすることにした。
もっと良い実装が眠っているはずなのに見つからない。。。
本当に、.NETフレームワークって直感的じゃないよね~
それともオレがバカなのか???

な~んて思っていたところ、解決方法を発見!

// JPEGをBitmapにコピーして書き込みをする
Response.Clear();
Bitmap jpeg = new Bitmap("c:/sample.jpg");
Bitmap bitmap = new Bitmap(jpeg.Width, jpeg.Height, PixelFormat.Format24bppRgb);
Graphics graph = Graphics.FromImage(bitmap);
graph.DrawImage(jpeg, new Point(0,0));
graph.DrawRectangle(Pens.Blue, 0, 0, bitmap.Width, bitmap.Height);
graph.DrawEllipse(Pens.Red, 10, 10, bitmap.Width -20, bitmap.Height -20);
bitmap.Save(Response.OutputStream, ImageFormat.Jpeg);
graph.Dispose();
bitmap.Dispose();
jpeg.Dispose();
Response.End();

超簡単な事でした。
いや~、.NETフレームワークってすごいですね~ ^^;

にしても、Graphics.DrawImageメソッドのオーバーロードの多いこと!
しかも、MSDNが醜い見難い、、、
なんとかならんもんかね??(←どこの人?)

しかし、あれだね。
このオーバーロードを駆使すれば、画像の変形やらリサイズやらが簡単に出来るね。
なんともはや、デラらくやし。

graph.DrawImage(jpeg, new Rectangle(0,0, jpeg.Width/2, jpeg.Height/2));

とかね。
ソニーストア

by isoq | 2004-11-25 17:48 | Web
<< ドラクエ8到着予定! 探検ぼくの街 >>