在Delphi 7中,我可以使用图像组件来做到这一点,这一切都很好,但是我试图将这个相同的功能转换为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;
这是pascal中的工作结果。 现在,当我尝试在C#中实现此行为时,我尝试了以下
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();
我对pascal示例的结果按预期工作,因为它只是一个256像素的调色板,C#绘制的图像非常小我已经尝试了图片框的所有缩放/拉伸选项,如果我改变bmp的高度&amp;宽度从256/256到更低的值图像大小增加但看起来没有像工作的delphi示例,任何提示?哈哈
答案 0 :(得分:1)
您显示的pascal代码不会生成您显示的图像。图像可能是256 x 256像素,但您最多只能处理15 x 15像素。如果您注意正确格式化代码,那么很容易发现,所以我为您格式化了。
您的调色板有256种颜色,显然您显示的图像显示每种颜色为16 x 16像素块。您需要再添加两个循环来处理这些块。
然后,为了解决图像中的像素,您需要计算水平和垂直的block * 16 + pixwithinblock
。
pascal代码可能如下所示:
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#程序员,但似乎您已正确转换,所以我们确定您也可以转换此修改过的pascal代码。