图像数据,把它转换成我们可以在屏幕上看见的图像(100分)

  • 主题发起人 主题发起人 zhouxiangjun
  • 开始时间 开始时间
Z

zhouxiangjun

Unregistered / Unconfirmed
GUEST, unregistred user!
知道宽度,高度及图像数据.怎样把它转换成我们可以在屏幕上看见的图像
 
256色的,一个字节代表一个像素
 
你可以用TCanvas,然后用:Canvas.Pixels[X, Y]来画点

如果要快的请,需要用到Scanline
 
具体点啊!不会啊!
 
bmp := TBitMap.Create;
bmp.Height := pic_h;
bmp.Width := pic_w;
bmp.PixelFormat := pf24bit;
for j:= 0 to bmp.Height-1 do
begin
PRGB := bmp.ScanLine[j];
for i:= 0 to bmp.Width-1 do
begin
PRGB^.rgbtRed := data[j];
PRGB^.rgbtGreen := data[j];
PRGB^.rgbtBlue := data[j];
Inc(PRGB);
end;
end;
Bitblt(Image1.Canvas.Handle, 0, 0, pic_w, pic_h, bmp.Canvas.Handle, 0, 0, SRCCOPY);
Image1.Refresh;
bmp.Free;

显示灰度图象。
 
我不是24位的,我是256色的,一个字节代表一个像素
 
我上面的程序就是256色的例程,r,g,b设成一样的值,就是灰度显示。
 
256色位图,其实你自己生成一个bmp文件在内存中更方便。
有调色版吗?

这是我程序中用的,直接复制过来你修改一下吧。
TImageElementInfo = record
ID: Integer;
Address: Cardinal;
Size: Cardinal;
OffsetX: Integer;
OffsetY: Integer;
Width: Integer;
Height: Integer;
HoldEast: Byte;
HoldSouth: Byte;
Warp: Boolean;
DoubleGround: Boolean;
Unknown: Integer;
Number: Integer;
end;

TImageElementHead = record
Fixup: Word;
Ver: Byte;
Unknown: Byte;
Width: Integer;
Height: Integer;
Size: Integer;
end;


/////程序部分
//Size就是宽度*高度,必须为4的倍数
//Todo: 判断BMP位图数据大小
if Size mod 4 > 0 then Size := (Size div 4 + 1) * 4;

//Todo: BMP文件头
with bmpFileHead do begin
bfType := $4D42;
bfSize := $436 + Size;
bfReserved1 := 0;
bfReserved2 := 0;
bfOffBits := $436;
end;

//Todo: BMP信息头
with bmpInfoHead do begin
biSize := $28;//这个是文件头,不要变
biWidth := bWidth;//宽度
biHeight := bHeight;//高度
biPlanes := 1;
biBitCount := 8;
biCompression := 0;
biSizeImage := Size;
biXPelsPerMeter := 4000;
biYPelsPerMeter := 4000;
biClrUsed := 256;
biClrImportant := 0;
end;

BitmapStream.Position := 0;
MemoryStream := TMemoryStream.Create;
MemoryStream.Position := 0;
MemoryStream.WriteBuffer(bmpFileHead, 14);
MemoryStream.WriteBuffer(bmpInfoHead, 40);
MemoryStream.WriteBuffer(DefaultPalette, 1024); //这里要调色板0-255,4个字节表示一个颜色0,r,g,b。我这里的DefaultPalette是一个数组
MemoryStream.CopyFrom(BitmapStream, BitmapStream.Size);//我的BitmapStream就是一个字节一个字节的颜色代号数据了。
MemoryStream.Position := 0;
BitmapStream.Free;
//至此,MemoryStream就是一个内存中的bmp文件了。
BmpElement := TBitmap.Create;
BmpElement.LoadFromStream(MemoryStream);


//大致修改了一下,没细看。有问题再说。
 
后退
顶部