|
发表于 2009-8-30 20:58:36
|
显示全部楼层
<p>我的思路是,不要这样直接在两个线程间传递对象,而是传递一些非对象的东西,比如字节数组.</p>
<p> </p>
<p>你既然已经在A EXE中生成了缩略图,则可以用BitBlt从一个DC绘到另一个DC来.</p>
<p> </p>
<p>另外,不知道你试过使用GDI+来生成缩略图没?</p>
<p> </p>
<p>我这里给你贴一个GDI+生成缩略图的代码,经测试,我的机器上生成一个6.03M的BMP的313x271大小的缩略图,耗时0.5秒左右.</p>
<p> </p>
<p>BMP的大小是1255x17115,是一个网页截图.</p>
<p> </p>
<p>如果这代码在台式机的7200转硬盘上使用,应该会更快的吧:</p>
<p> </p>
<div class="msgheader">QUOTE:</div><div class="msgborder"><b>
<p><font face="Verdana">Option Explicit</font></p>
<p><font face="Verdana">Private Type GdiplusStartupInput<br/> GdiplusVersion As Long<br/> DebugEventCallback As Long<br/> SuppressBackgroundThread As Long<br/> SuppressExternalCodecs As Long<br/>End Type</font></p>
<p><font face="Verdana">Private Enum GpStatus 'Status<br/> Ok = 0<br/> GenericError = 1<br/> InvalidParameter = 2<br/> OutOfMemory = 3<br/> ObjectBusy = 4<br/> InsufficientBuffer = 5<br/> NotImplemented = 6<br/> Win32Error = 7<br/> WrongState = 8<br/> Aborted = 9<br/> FileNotFound = 10<br/> ValueOverflow = 11<br/> AccessDenied = 12<br/> UnknownImageFormat = 13<br/> FontFamilyNotFound = 14<br/> FontStyleNotFound = 15<br/> NotTrueTypeFont = 16<br/> UnsupportedGdiplusVersion = 17<br/> GdiplusNotInitialized = 18<br/> PropertyNotFound = 19<br/> PropertyNotSupported = 20<br/>End Enum</font></p>
<p><font face="Verdana">Private Declare Function GdiplusStartup Lib "gdiplus" (token As Long, inputbuf As GdiplusStartupInput, Optional ByVal outputbuf As Long = 0) As GpStatus<br/>Private Declare Function GdiplusShutdown Lib "gdiplus" (ByVal token As Long) As GpStatus<br/>Private Declare Function GdipDrawImageRect Lib "gdiplus" (ByVal graphics As Long, ByVal Image As Long, ByVal X As Single, ByVal Y As Single, ByVal Width As Single, ByVal Height As Single) As GpStatus<br/>Private Declare Function GdipCreateFromHDC Lib "gdiplus" (ByVal hDC As Long, graphics As Long) As GpStatus<br/>Private Declare Function GdipDeleteGraphics Lib "gdiplus" (ByVal graphics As Long) As GpStatus<br/>Private Declare Function GdipLoadImageFromFile Lib "gdiplus" (ByVal filename As String, Image As Long) As GpStatus<br/>Private Declare Function GdipDisposeImage Lib "gdiplus" (ByVal Image As Long) As GpStatus</font></p>
<p><font face="Verdana">Dim gdip_Token As Long<br/>Dim gdip_Image As Long<br/>Dim gdip_Graphics As Long</font></p>
<p><font face="Verdana">'————————————<br/>'– 使用者请保留作者版权<br/>'– 作者:BEAR-BEN<br/>'– QQ:453628001<br/>'————————————</font></p>
<p><font face="Verdana">'————-缩略图函数———<br/>Public Sub ShowTNImg(PBox As Object, ImagePath As String, WidthMax As Long, HeightMax As Long)<br/> If LoadGDIP Then<br/> If GdipCreateFromHDC(PBox.hDC, gdip_Graphics) <> 0 Then<br/> GdiplusShutdown gdip_Token<br/> Else<br/> '载入图片到内存中<br/> GdipLoadImageFromFile StrConv(ImagePath, vbUnicode), gdip_Image<br/> <br/> '使用GDI+直接从内存中缩略并绘图,GDI+有很好的反锯齿能力<br/> If GdipDrawImageRect(gdip_Graphics, gdip_Image, 0, 0, WidthMax, HeightMax) <> Ok Then Debug.Print "显示失败。。。"<br/> End If<br/> End If<br/> DisposeGDIP<br/>End Sub</font></p>
<p><font face="Verdana">Public Function LoadGDIP() As Boolean<br/> Dim GpInput As GdiplusStartupInput<br/> <br/> GpInput.GdiplusVersion = 1<br/> LoadGDIP = Not (GdiplusStartup(gdip_Token, GpInput) <> 0)<br/>End Function</font></p>
<p><font face="Verdana">Public Sub DisposeGDIP()<br/> GdipDisposeImage gdip_Image<br/> GdipDeleteGraphics gdip_Graphics<br/> GdiplusShutdown gdip_Token<br/>End Sub</font></p></b></div>
<p> </p>
<p>代码出处:</p>
<p> </p>
<p><font face="Verdana"><a href="http://www.tcdongli.com/archives/12">http://www.tcdongli.com/archives/12</a></font></p>
<p> </p>
<p>我作了一些改动.原作多处使用了END,并未将错误返回,我认为这不太好.</p>
<p> </p>
<p>最后祝你好运.</p>
[此贴子已经被作者于2009-8-30 20:59:25编辑过] |
|