如何可以保存为图片?

chenwenwen1 2009-11-14 05:55:48
C代码:
char *BitResource = BitInBitmap();
BITMAPFILEHEADER* pBitHeader = (BITMAPFILEHEADER*) BitResource;
int BitSize = pBitHeader->bfSize;
file.open("D:\\Bit.bmp");
file.write(BitResource, BitSize);
file.close();

---------------------------------------------------------
function BitInBitmap() : pchar //这个是动态库函数
-------------------------------------------------------

var
pBitHeader : ^BITMAPFILEHEADER;
cBitInBit : pchar;
begin
cBitInBit := BitInBitmap();
pBitHeader := @(cBitInBit^);

获取到pBitHeader以后如何存为文件?后面该怎么写.请帮忙.
...全文
256 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenwenwen1 2009-11-24
  • 打赏
  • 举报
回复
File.Write(pBitHeader^,BitSize);

已解决
不得闲 2009-11-19
  • 打赏
  • 举报
回复

//*****************************************
//函数: SaveHBmpToStream
//作者: 不得闲
//功能:通过Bitmap句柄保存为二进制流数据
//*****************************************
procedure SaveHBmpToStream(const bmpHandle: HBITMAP;Stream: TStream);
var
ds: TDIBSection;
BmpFileHeader: TBitmapFileHeader;
NumberOfColors,BitCount: Integer;
Bm: tagBITMAP;
Bytes: integer;
begin
if Stream = nil then
raise Exception.Create('Stream无效');
Stream.Size := 0;
Bytes := GetObject(bmpHandle,SizeOf(ds),@ds); //获得有关DIBSECTION结构中的点阵图资讯
if Bytes = 0 then
raise Exception.Create('无效的位图文件');
Bytes := GetObject(bmpHandle,SizeOf(bm),@Bm);//获得tagBITMAP结构
if Bytes = 0 then
raise Exception.Create('无效的位图文件');
NumberOfColors := ds.dsBmih.biClrUsed;//获得调色板中实际使用的颜色数
BitCount := ds.dsBmih.biBitCount;//位图位数
if (NumberOfColors = 0) and (BitCount <= 8) then
NumberOfColors := 1 shl BitCount;
With BmpFileHeader do
begin
bfType := $4D42; // 'BM'位图标记
bfReserved1 := 0;
bfReserved2 := 0;
bfOffBits := SizeOf(TBitmapFileHeader) +
SizeOf(TBitmapInfoHeader) +
NumberOfColors*SizeOf(TRGBQuad); //获得信息头大小
bfSize := bfOffBits + ds.dsBmih.biSizeImage; //获得文件大小
end;
Stream.Write(BmpFileHeader,sizeof(BITMAPFILEHEADER));
Stream.Write(ds.dsBmih,sizeof(TBITMAPINFOHEADER));
stream.Write(Bm.bmBits^, ds.dsBmih.biSizeImage);
Stream.Seek(0,soFromBeginning);
end;
chenwenwen1 2009-11-18
  • 打赏
  • 举报
回复
2楼7楼市正解,问题就是如何保存文件或者流。。。。。

5楼,谢谢,我等下试试。多谢。
wooden954 2009-11-16
  • 打赏
  • 举报
回复
关于2楼和7楼的意见:
BitInBitmap()返回的本身就是Bitmap图片的数据流,所以没有必要再“建一个Bitmap类,Bitmap.loadFromStream,再Bitmap.SaveToFile”,直接将函数返回结果作为数据流存储到磁盘文件即可。
IVC2009 2009-11-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wintergoes 的回复:]
建一个Bitmap类,把图片信息保存到一个数据流中
用Bitmap.loadfromstream读进bitmap中,然后bitmap.savetofile
[/Quote]

正解
贝隆 2009-11-16
  • 打赏
  • 举报
回复
wooden954 2009-11-16
  • 打赏
  • 举报
回复

var
pBitHeader : ^BITMAPFILEHEADER;
cBitInBit : pchar;
bitSize : integer;
aFile:TFileStream;
begin
cBitInBit := BitInBitmap();
pBitHeader := @(cBitInBit^);
bitSize := pBitHeader.bfSize
aFile:=TFileStream.Create('D:\aBmp.bmp');
aFile.Write(pBitHeader,BitSize);
// 或aFile.Write(pBitHeader^,BitSize);
// 楼主可分别试验一下这两条哪个能够成功
aFile.free;

chenwenwen1 2009-11-16
  • 打赏
  • 举报
回复
顶一下
chenwenwen1 2009-11-15
  • 打赏
  • 举报
回复
把图片信息保存到一个数据流中怎么做啊?可以写下代码吗?

现在的问题就是怎么能够保存到文件,如果采用数据流也就是怎么能够读到数据流中
wintergoes 2009-11-14
  • 打赏
  • 举报
回复
建一个Bitmap类,把图片信息保存到一个数据流中
用Bitmap.loadfromstream读进bitmap中,然后bitmap.savetofile
hjkto 2009-11-14
  • 打赏
  • 举报
回复
procedure TForm1.FormCreate(Sender: TObject);
var
fileheader:tbitmapfileheader; //位图的文件头
infoheader:tbitmapinfoheader; //位图的信息头
stream:tfilestream;//文件流对象
localbmp:tbitmap; //位图对象
linelen:integer; //每一行像素长度
clipleft,cliptop,clipwidth,clipheight,bytecount:integer;
i:integer;
//j:integer; //位图倒立显示,变量
begin
form1.Width:=screen.Width;
form1.Height:=screen.Height;
form1.Top:=0;
form1.Left:=0;
self.DoubleBuffered:=true; //建立双缓冲
cliptop:=0;
clipwidth:=image1.Width;
clipheight:=image1.Height;
//将位图加载到文件流中
stream:=tfilestream.Create('2.bmp',fmopenread or fmsharedenywrite);
localbmp:=tbitmap.Create;//创建位图实例
stream.Read(fileheader,sizeof(tbitmapfileheader));//读取文件头数据
stream.Read(infoheader,sizeof(tbitmapinfoheader));//读取信息头数据
localbmp.Width:=clipwidth;
localbmp.Height:=clipheight;
localbmp.PixelFormat:=pf24bit;//设置为24位位图
bytecount:=3;
clipleft:=0;
//j:=clipheight-1;//位图倒立显示,变量
linelen:=(bytecount*infoheader.biWidth+3) shr 2 shl 2;
for i:=cliptop to cliptop + clipheight -1 do
begin
//设置新的指针位置
stream.Position :=integer(fileheader.bfOffBits) + linelen * (infoheader.biHeight-1-i) + bytecount * clipleft;
//stream.Read(localbmp.scanline[j-i]^,clipwidth * bytecount); //位图倒立显示
//将新的数据读进文件流中
stream.Read(localbmp.scanline[i-cliptop]^,clipwidth * bytecount);//位图正常显示
end;
image1.Picture.Bitmap.Assign(localbmp);
end;

end.
c不懂,看看这段d的代码,能不能有参考作用!

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi GAME,图形处理/多媒体
社区管理员
  • GAME,图形处理/多媒体社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧