100分,请问如何从内存流中读取JPG,已经将JPG转成位图,在线等 ( 积分: 100 )

  • 主题发起人 主题发起人 tzvnet
  • 开始时间 开始时间
T

tzvnet

Unregistered / Unconfirmed
GUEST, unregistred user!
用API实现,不用JPEG单元,已经有转换JPEG到BMP的单元。
var
dc , tmpDC: HDC;
bmp: HBITMAP;
pStru:PAINTSTRUCT;
pImg:Pointer;
MS:TMemoryStream;
Bf:BITMAPFILEHEADER;
Bmf: TBitmapFileHeader;

WM_PAINT:begin
BeginPaint(hWnd,pStru);
/////LoadJpegFile(JpegFileName:string;var pImg:Pointer):Boolean;
if LoadJpegFile('221_2.jpg',pImg) then begin //转换位图
MS:=TMemoryStream.Create;
CopyMemory(@bf,pImg,sizeof(BITMAPFILEHEADER));
MS.Write(pImg^,bf.BfSize);
MS.ReadBuffer(Bmf, sizeof(Bmf));
//已经将位图储存到流中
//问题就在这,应该怎么把MS到BMP中。或者能否有更简单的方法?//bmp: HBITMAP;
//BMP:=
MS.Free;
FreeMem(pImg);

tmpDc := CreateCompatibleDC(DC);
Oldbmp := SelectObject(tmpDC,bmp);
BitBlt(DC,0,0,500,500,tmpDC,0,0,SRCCOPY);
SelectObject(tmpDC,oldbmp);
DeleteDC(tmpDC);
DeleteObject(bmp);
ReleaseDC(hWnd,dc);

EndPaint(hWnd,pStru);
end;
 
用API实现,不用JPEG单元,已经有转换JPEG到BMP的单元。
var
dc , tmpDC: HDC;
bmp: HBITMAP;
pStru:PAINTSTRUCT;
pImg:Pointer;
MS:TMemoryStream;
Bf:BITMAPFILEHEADER;
Bmf: TBitmapFileHeader;

WM_PAINT:begin
BeginPaint(hWnd,pStru);
/////LoadJpegFile(JpegFileName:string;var pImg:Pointer):Boolean;
if LoadJpegFile('221_2.jpg',pImg) then begin //转换位图
MS:=TMemoryStream.Create;
CopyMemory(@bf,pImg,sizeof(BITMAPFILEHEADER));
MS.Write(pImg^,bf.BfSize);
MS.ReadBuffer(Bmf, sizeof(Bmf));
//已经将位图储存到流中
//问题就在这,应该怎么把MS到BMP中。或者能否有更简单的方法?//bmp: HBITMAP;
//BMP:=
MS.Free;
FreeMem(pImg);

tmpDc := CreateCompatibleDC(DC);
Oldbmp := SelectObject(tmpDC,bmp);
BitBlt(DC,0,0,500,500,tmpDC,0,0,SRCCOPY);
SelectObject(tmpDC,oldbmp);
DeleteDC(tmpDC);
DeleteObject(bmp);
ReleaseDC(hWnd,dc);

EndPaint(hWnd,pStru);
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
a: TBITMAP ;
begin
a.Create;
a.LoadFromStream();
end;
 
image1.Picture.Graphic.LoadFromStream(ms);
 
楼上2位都是用了Graphics单元,我要API实现,不用Graphics单元,直接BitBlt的面板上
 
哎,只要能够实现,而且不影响功能的话,我觉得就可以
 
因为软件是纯PASCAL语言写的,只引用了windows,winsock,还有几个自己写的函数定义,即使用上Graphics也没什么用啊
 
那你看看Graphics的源代码有没有啊。不要总等这里回复啊。
 
// 此例子假设 JPG 转换而来的 BMP 是 RGB24,未经测试
function CreateBmpFromBuffer(pBuf: Pointer; nBufSize: Integer; Bf: BITMAPFILEHEADER): HBitmap;
var
dc:HDC;
bi: BITMAPINFO;
pBmp: Pointer;
begin
ZeroMemory(@bi, SizeOf(bi));
bi.bmiHeader := Bf;

dc := GetDC(0);
Result := CreateDIBSection(dc, @bi, DIB_RGB_COLORS, @pBmp, 0, 0);
ReleaseDC(0, dc);

Move(pBuf^, pBmp^, nBufSize);
end;
 
后退
顶部