プロが教える店舗&オフィスのセキュリティ対策術

お世話になります。

ファイルからではなく、パレットやパターンのデータ配列から、
内部でイメージを作成して、表示できるようにする
方法を教えてください。

Javaでいうところの、MemoryImageSourceに当たると思うのですが、
表示までの流れを知りたいのです。

初心者で申し訳ありませんが、何卒よろしくお願いいたします。

A 回答 (2件)

ビットマップイメージのバイト列は既に生成されている、という認識でよいでしょうか?


BITMAPFILEHEADERを含むBITMAPイメージデータを byte[] bitmapimage で持っているとした場合、

Bitmap bmp = new Bitmap(new System.IO.MemoryStream(bitmapimage));
pictureBox1.Image = bmp;

でビットマップを作成して、ピクチャーボックスに設定することで画像を表示できます。

ビットマップイメージを作るのが面倒という場合は、
Bitmap bmp = new Bitmap(width, height, pixelformat);
で無地のビットマップを作成して、

BitmapData bmpdata = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, bmp.PixelFormat);
IntPtr ptr = bmpdata.Scan0;

とすることにより、パターンのデータ配列を取得できるのでデータ配列をコピーすればよいと思います。
ただし、この方法ですとパレットを操作する方法はちょっと分かりませんでした。

この回答への補足

i-kujouさん、ありがとうございます。

やはり、パレットのイメージは作成できないのでしょうか…。
そのところをクリアしたかったのですが、もう少し
方法を探ってみます。

引き続き、よろしくお願いいたします。

補足日時:2009/01/20 18:20
    • good
    • 0

 こんばんは。



 例えば、ピクチャーボックスが有り、ボタンが押されたら、データから読み込んでピクチャーボックスに表示される様にする場合、Bitmapクラスをパターン(イメージデータ)のサイズに合わせて作成し、ループで回転しながらパターンからデータを読んでSetPixel()で色彩を設定してあげれば良いのでは?
 ただし、スピードは素晴らしく遅いみたいです。以下参考程度に。

//ボタンが押されたら・・・
private void button1_Click(object sender, EventArgs e)
{
//色彩テーブル(本当は何処かから引っ張ってくる)
byte[,,] rgbTable = new byte[96, 64, 3];

//ビットマップクラスの作成
Bitmap bitmap = new Bitmap(96, 64);

//ループで回転して書き込む
for (int y = 0; y < bitmap.Height; ++y)
{
for (int x = 0; x < bitmap.Width; ++x)
{
//0がR、1がG、2がB
Color color = Color.FromArgb(rgbTable[x, y, 0], rgbTable[x, y, 1], rgbTable[x, y, 2]);

//色彩をビットマップにセットする
bitmap.SetPixel(x, y, color);
}
}
//ピクチャーボックスにビットマップクラスを渡す
this.pictureBox1.Image = bitmap;

//ピクチャーボックスの画面を更新する
this.pictureBox1.Invalidate();
}

この回答への補足

machongolaさん、ご返答ありがとうございます。

速度的に遅いというのは、少し問題です。
また、説明に書き忘れましたが、Directではなく
IndexのImageで扱えるほうが希望です。

再び質問の継続をいたします。
わざわざお答えいただいたのに、すみません。

補足日時:2009/01/18 09:24
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!