2016-07-27 8 views
-1

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; 

enter image description here

これはただ明確にすることがパスカルで働いた結果です。私は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

答えて

1

表示したパスカルコードでは、表示された画像が生成されません。画像はおそらく256 x 256ピクセルですが、最大15 x 15ピクセルの画像しか表示されません。あなたのコードを適切に書式設定することに注意を払うと、見つけやすくなりますので、私はあなたのためにフォーマットしました。

あなたのパレットは256色で、明らかに表示した画像は16色×16ピクセルのブロックとして表示されます。これらのブロックに対処するには、さらに2つのループを追加する必要があります。

画像内のピクセルを指定するには、水平方向と垂直方向の両方でblock * 16 + pixwithinblockを計算する必要があります。

パスカルのコードは次のようになります。

procedure TForm6.Button2Click(Sender: TObject); 
var 
    x, y: integer; // block indexes 
    i, ii, // pixels within a block 
    iii: integer; // palette index 
begin 
    iii := 0; 
    for y := 0 to 15 do 
    begin 
    for x := 0 to 15 do 
    begin 
     for i := 0 to 15 do 
     begin 
     for ii := 0 to 15 do 
     begin 
      Image1.Canvas.Pixels[x * 16 + ii, y * 16 + i] := 
      RGB(RGBA[iii].rgbBlue, RGBA[iii].rgbGreen, RGBA[iii].rgbRed); 
     end; 
     end; 
     inc(iii); 
    end; 
    end; 
end; 

注意をカラーインデックスが時にブロック率の変化を変更すること。

また、あなたは水平方向と垂直方向0 ..として255ピクセルに対応し、次のようにカラーインデックスを計算することができます:

procedure TForm6.Button3Click(Sender: TObject); 
var 
    i, ii, iii: integer; 
begin 
    for i := 0 to 255 do 
    for ii := 0 to 255 do 
    begin 
     iii := (i div 16) * 16 + (ii div 16); 
     Image1.Canvas.Pixels[ii, i] := 
     RGB(RGBA[iii].rgbBlue, RGBA[iii].rgbGreen, RGBA[iii].rgbRed); 
    end; 
end; 

私はC#プログラマではないんだけど、あなたが変換を持っているようです正しく、この変更されたパスカルコードを変換することもできます。

関連する問題