最近项目中有需要显示tiff图像,并且需要能够进行缩放和移动。用的vb写的,现在碰到一个问题是如何把vb中的image对象或者bitmap对象进行缩放后生成一个新的image或者bitmap对象。但是不知道在vb中是怎么弄的,我再网上看到很多用picturebox的paintpicture方法来实现,但是我没有看到这个方法不知为什么(用的vb.net)。哪位大哥如果知道方法,还望指导一下。最好速度快点的,一张图一般有50m大小。vb图片缩放tiffbitmap

解决方案 »

  1.   

    本帖最后由 bcrun 于 2013-10-12 08:44:59 编辑
      

  2.   

    那你直接调用StretchBlt不就行了,应该比.NET里封装的理论上还要快一些,毕竟省了中间步骤:Private Declare Function StretchBlt Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long.net里你看下Graphics.DrawImage的使用
      

  3.   

    那我再问一下,如果我现在有一个image对象(system.drawing.image),我想把它按一个比列缩小成另一个image对象该怎么做?就是这个函数返回给我的一定要是一个image类型的对象,这个能实现么。另外有一个就是如果我用一个image来新建一个bitmap对象是不是,产生的bitmap占用的内存会比原来的image大很多?问题有点多,还望版主帮帮忙啊!!
      

  4.   

    可以先把一个大图载入到内存,用GDIPLUS ,就是GDI+,然后绘制到窗体背景上,这个是不大不小的图,然后你选择某部分后,把这部分再放大绘制到一个新图层(类似PICTUREBOX控件之类),只是把内存中的东西绘制一部分出来再进行放大或缩小,速度很快的,要转几个角度都不是问题,GDI+就是专门干这个的,IMG对象一直在内存中就行,绘制的时候只是一小部分,所以速度很快,效率也很高
      

  5.   

    这样速度差不多可以达到要求,不过由于这些图一般都比较大,所以缩放的最大比例和最小比例可能会差不多100,如果只是用一张不大不小的图来提供放大和缩小,出来的图的质量就太差了。哎!反正这样差不多也够,很好奇想windows自带的图片查看器是怎么做到那么流畅的缩放和移动的。
      

  6.   

    其实你试了这几句代码就知道了
    Dim imgBuffer As Image =  Image.FromFile("flower.jpg")
    dim sglScale as Single=0.5 '缩小一半
    Dim imgNew As New System.Drawing.Bitmap(imgBuffer, imgBuffer.Width * sglScale, imgBuffer.Height * sglScale)
    me.pictureBox1.Image = imgNew
      

  7.   

    恩,这个可以。多谢版主,问最后一个问题,像这个代码生成的bitmap和原来的image比较占内存怎么样呢?我再我自己原来的程序中发现好像bitmap比image占的内存要多很多。然后我像你给的代码一样通过这种方式多次缩小图片后内存直接飙升。我打开的图大小为50m,在每次执行这样的缩小后就占的内存就会多出100多m,后来我在每次缩放图片后用gc强制收回内存,内存差不多维持在179m左右,还可以接受,但是现在有个问题是在xp上貌似gc工作的不是太好,除了用gc回收垃圾还有什么好的办法没有。额,貌似多问了一个问题。哈哈,,,版主如果有空的话就回个吧,没空就算了。暂时先这样差不多也够了。
      

  8.   

    你说的情况,应该主要是载入jpg图像后对象内部自动转换成位图数据(这样才能继续做显示图片和缩放处理等操作)所占用的内存吧。比如如果是按位图中每个像素32位占4字节算的话,你179M就大约对应一个近6000万像素的图片了。我最近没拿这个大的图片测试过,不过如上所述,你避免程序中有多个imgBuffer这样的对象同时处于生存期就可以了吧。毕竟现在这个内存论G的时代,你一个处理大图片的程序,使用200-300M内存应该也不算夸张吧
      

  9.   

    恩,是还好。主要是vb释放大内存的速度太慢了。在每次缩放时都会申请一大块内存,照理在缩放操作结束时应该把这块内存释放掉,但我观察任务管理器,要过好久才会释放,这就导致了如果在一分钟内进行5次缩放,内存就会达到将近一个g。后来逼不得已就只能强制用gc回收内存了。在程序中每次只会有一张原始的image和一张有这张image生成的bitmap驻留,加起来大概有150m左右。