关于GDI+从流加载PNG文件
好久没来了,昨天一朋友程序调试程序出错,当是正忙,没时间看,晚上回去研
究了一下,帖子却结了,我只好自己来发一个,希望熟悉gdi+的朋友来讨论一下
。(其他gdi+方面的也欢迎留言,我刚用gdi+不久,希望多交流)
先留下联络方式:66434721(这个群算得上火爆,虽然废话比较多……)
var //这个是他的源码
Stream: TMemoryStream;
istreamTest: IStream;
GPImage: TGPImage;
Graphic: TGPGraphics;
begin
Stream := TMemoryStream.Create;
Stream.LoadFromFile('c:\1.png');
istreamTest:= TStreamAdapter.Create(Stream);
Graphic := TGPGraphics.Create(Canvas.Handle);
try
GPImage := TGPImage.Create(istreamTest);
//这句会报错,如果图片是BMP就没错
Graphic.DrawImage(GPImage, 0, 0);
finally
Stream.Free;
GPImage.Free;
Graphic.Free;
end;
end;
回去后调试了一下,
TStreamAdapter = class(TInterfacedObject, IStream)可参考下面文章
http://delphi.sharpplus.com/Delphi/Delphi-adapter.htm
我的实现方法
type
TCFStreamAdapter = class(TStreamAdapter)
public
function Stat(out statstg: TStatStg; grfStatFlag: Longint): HResult;
override; stdcall;
end;
function TCFStreamAdapter.Stat(out statstg : TStatStg; grfStatFlag :
Integer): HResult;
begin
result := inherited
Stat(statstg, grfStatFlag);
//TStatStg结构下面2个属性在TStreamAdapter.Stat里并没有初始化
statstg.pwcsName := nil;
statstg.reserved:=0;
end;
//改他的过程如下
var
Stream: TMemoryStream;
GPImage: TGPImage;
LIStream: TCFStreamAdapter;
MYGUID: TGUID;
Graphic: TGPGraphics;
begin
Stream := TMemoryStream.Create;
Stream.LoadFromFile('c:\1.png');
LIStream := TCFStreamAdapter.Create(Stream);
GPImage := TGpImage.Create(LiStream);
edit1.Text:=inttostr(LiStream.Stream.Size);
Graphic := TGPGraphics.Create(Canvas.Handle);
try
Graphic.DrawImage(GPImage, 0, 0);
GetEncoderClsid('image/bmp', MYGUID); {先获取格式编码}
GPImage.Save('c:\1.bmp', MYGUID);
finally
Stream.Free;
GPImage.Free;
Graphic.free;
end;
end;
下面方法来自阿发伯的日志,实现的更简单,据说是翻译自C++,希望有熟悉C++
的朋友能给出原理
var
tmp: TGpBitmap;
Adapter: TStreamAdapter;
Stream: TMemoryStream;
Clsid: TGUID;
Graphic: TGPGraphics;
begin
Stream := TMemoryStream.Create;
Adapter := TStreamAdapter.Create(Stream, soOwned);
Stream.LoadFromFile('c:\1.png');
GetEncoderClsid('image/bmp', Clsid);
IStream(Adapter)._AddRef;
Graphic := TGPGraphics.Create(Canvas.Handle);
tmp := TGpBitmap.Create(Adapter);
try
tmp.Save('c:\1.bmp',Clsid);
Graphic.DrawImage(tmp, 0, 0);
finally
tmp.Free;
Graphic.free;
IStream(Adapter)._Release;
end;
end;
[解决办法]
我顶!!!
[解决办法]
我再顶!
[解决办法]
呵呵 再帮楼主顶一个
[解决办法]
JF
[解决办法]
还是opencv处理起来更简洁一些
IplImage *input = cvLoadImage("E:\\1.png",1);CvSize outputSize = { input->width, input->height };IplImage* output = cvCreateImage( outputSize, input->depth, input->nChannels );cvResize( input, output ,CV_INTER_AREA);cvResetImageROI( output );cvSaveImage( "E:\\1.bmp",output );cvReleaseImage( &input );cvReleaseImage( &output );
[解决办法]