Delphi 7では、これをイメージコンポーネントを使用して行うことができますが、これはすべて上質でダンディですが、この同じ機能をC#に変換しようとしています。Pascal> C#ピクチャボックスの問題に生のピクセルデータを描画する
procedure TMain_Form.Load_Pallete_WPN(FileName: string);
var
MOMO_Fs: TFileStream;
i, ii, iii: integer;
begin
MOMO_Fs := TFileStream.Create(FileName, fmOpenRead);
MOMO_Fs.Position := $82D80;
MOMO_Fs.Read(RGBA, $400);
iii := 0;
for i := 0 to 15 do
begin
for ii := 0 to 15 do
begin
Pallet_Preview.Picture.Bitmap.Canvas.Pixels[ii, i] :=
RGB(RGBA[iii].b, RGBA[iii].G, RGBA[iii].R);
inc(iii);
end;
end;
MOMO_Fs.Free;
end;
これはただ明確にすることがパスカルで働いた結果です。私はC#でこの動作を実装しようとすると、それはC#の描画された画像は、私が持っている非常に小さいだけ256ピクセルパレットであるとして は、今私は、意図した作品としてパスカルの例では、次の
public struct TRGBA_Obj
{
public byte b;
public byte g;
public byte r;
public byte a;
}
public TRGBA_Obj[] RGBA = new TRGBA_Obj[255];
public string fp;
public void Load_Pallette(string filepath)
{
int i, ii, iii;
FileStream fs = new FileStream(filepath, FileMode.Open);
BinaryReader br = new BinaryReader(fs);
Bitmap bmp = new Bitmap(256, 256);
fs.Seek(0x82D80, SeekOrigin.Begin); // this is where the palette is
for (int x = 0; x < RGBA.Length; x++)
{
RGBA[x].r = br.ReadByte();
RGBA[x].g = br.ReadByte();
RGBA[x].b = br.ReadByte();
RGBA[x].a = br.ReadByte();
// this just dumps the color values to a list view for ref
LV_COLOR_PALETTE.Items.Add(x.ToString());
LV_COLOR_PALETTE.Items[x].SubItems.Add(RGBA[x].r.ToString());
LV_COLOR_PALETTE.Items[x].SubItems.Add(RGBA[x].g.ToString());
LV_COLOR_PALETTE.Items[x].SubItems.Add(RGBA[x].b.ToString());
LV_COLOR_PALETTE.Items[x].SubItems.Add(RGBA[x].a.ToString());
}
iii = 0;
for (int y = 0; y < 15; y++)
{
for (int j = 0; j < 15; j++)
{
bmp.SetPixel(j, y, Color.FromArgb(RGBA[iii].a, RGBA[iii].r, RGBA[iii].g, RGBA[iii].b));
iii++;
}
}
random_box.Image = bmp;
fs.Close();
br.Close();
私の結果を試してみました私がbmpの高さを&の幅を256/256から低い値に変更すると、画像サイズが大きくなりますが、実際のデルファイの例のようには見えません。 haha