bmp图像数据的数组存取(100分)

  • 主题发起人 主题发起人 necklace
  • 开始时间 开始时间
N

necklace

Unregistered / Unconfirmed
GUEST, unregistred user!
怎样将一个bmp图象用一个无符号的字符数组(pchar类型)来存放,谢谢!
 
先用TFileStream读入,
再从TFileStream读出即可
 
可用ScanLine方法解决,下面是一段将BMP图象灰度化的程序,你参考一下,改改就是了
procedure TImageBtn.DisableBmp(Bmp:TBitmap);
var
p:pByteArray;
x,y:integer;
Gray:byte;
begin
Bmp.PixelFormat:=pf24Bit;
for y:=0 to Bmp.Height-1 do
begin
p:=Bmp.ScanLine[y];
for x:=0 to Bmp.Width-1 do
begin
Gray:=Round(p[x*3+2]*0.3+p[x*3+1]*0.59+p[x*3]*0.11);
p[x*3]:=Gray;
p[x*3+1]:=Gray;
p[x*3+2]:=Gray;

end;
end;
end;
 
// 以无符号的字符数组保存
procedure TForm1.Button1Click(Sender: TObject);
var
ms: TMemoryStream;
bitarray: PChar;
bitsize: integer;
begin

// 取图像数据,数据在bitarray中, bitsize为数据长度
ms := TMemoryStream.Create;
try
// 导入TMemorystream;
Image1.Picture.Bitmap.SaveToStream(ms);

// 取图像数据
bitsize := ms.Size;
GetMem(bitarray, bitsize);
CopyMemory(bitarray, ms.Memory, bitsize);
finally
ms.Free;
end;

Image1.Canvas.FillRect(Rect(0,0,Image1.Width, Image1.Height));
ShowMessage('图像已保存,按确定按钮恢复');

// 恢复图像数据
ms := TMemoryStream.Create;
try
ms.SetSize(bitsize);
CopyMemory(ms.Memory, bitarray, bitsize);

// 从TMemorystream恢复
Image1.Picture.Bitmap.LoadFromStream(ms);
finally
ms.Free;
end;

FreeMem(bitarray);

ShowMessage('图像恢复');
end;

// 以流方式保存
procedure TForm1.BitBtn1Click(Sender: TObject);
var
ms: TMemoryStream;
begin
// 取图像数据,数据在ms中
ms := TMemoryStream.Create;
try
// 导入TMemorystream;
Image1.Picture.Bitmap.SaveToStream(ms);

Image1.Canvas.FillRect(Rect(0,0,Image1.Width, Image1.Height));
ShowMessage('图像已保存,按确定按钮恢复');

// 从TMemorystream恢复
ms.Position := 0;
Image1.Picture.Bitmap.LoadFromStream(ms);

ShowMessage('图像恢复');
finally
ms.Free;
end;
end;

从上面看,以TMemoryStream保存图像更好一些。
符合VCL风格,编程简单,速度快。
 
流操作
楼上的很详细了
 
后退
顶部