您的位置:程序门 -> vb -> 控件



如何将一张jpg图片,缩放成一定比例的图片子..请高手帮忙.


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


如何将一张jpg图片,缩放成一定比例的图片子..请高手帮忙.[已结贴,结贴人:tgc99]
发表于:2007-03-24 12:01:39 楼主
如何将一张jpg图片,缩放成一定比例的图片..请高手帮忙.

比如:123.jpg,长*宽=300*500,,我想生成宽为150的图片,长度按比例缩放.

生成的图尽量不失真,清楚,看上去与原图相似,但空间不能比原图占的还大...

来者有分,谢谢大家提供意见..
发表于:2007-03-24 14:26:391楼 得分:1
baidu.com上一大堆啊
发表于:2007-03-24 14:38:402楼 得分:10
假设一个picture1   装入   你的jpg图象,将autosize   属性设置为   true   .在放一个picture2,读出picture1的width   和height   的属性,然后根据你的需要进行缩放后设置成picture2的   width   和height   的属性。
然后
picture2.paintpicture   picture1.image,   0,   0,   picture2.width,   picture2.height
然后再用savepicture   保存下来就可以了。
发表于:2007-03-24 15:40:083楼 得分:1
哦,又學一招
发表于:2007-03-24 17:56:084楼 得分:40
option   explicit

private   declare   function   getdc   lib   "user32 "   (byval   hwnd   as   long)   as   long
private   declare   function   deletedc   lib   "gdi32 "   (byval   hdc   as   long)   as   long
private   declare   function   releasedc   lib   "user32 "   (byval   hwnd   as   long,   byval   hdc   as   long)   as   long
private   declare   function   createcompatibledc   lib   "gdi32 "   (byval   hdc   as   long)   as   long
private   declare   function   createcompatiblebitmap   lib   "gdi32 "   (byval   hdc   as   long,   byval   nwidth   as   long,   byval   nheight   as   long)   as   long
private   declare   function   createsolidbrush   lib   "gdi32 "   (byval   crcolor   as   long)   as   long
private   declare   function   selectobject   lib   "gdi32 "   (byval   hdc   as   long,   byval   hobject   as   long)   as   long
private   declare   function   deleteobject   lib   "gdi32 "   (byval   hobject   as   long)   as   long
private   declare   function   fillrect   lib   "user32 "   (byval   hdc   as   long,   lprect   as   rect,   byval   hbrush   as   long)   as   long
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
private   declare   function   setstretchbltmode   lib   "gdi32 "   (byval   hdc   as   long,   byval   nstretchmode   as   long)   as   long
private   declare   function   olecreatepictureindirect   lib   "olepro32.dll "   (lppictdesc   as   pictdesc,   riid   as   any,   byval   fpictureownshandle   as   long,   ipic   as   ipicture)   as   long

private   const   stretch_andscans   =   1
private   const   stretch_orscans   =   2
private   const   stretch_deletescans   =   3
private   const   stretch_halftone   =   4

private   type   pictdesc
        size                                 as   long
        type                                 as   long
        hbmporicon                     as   long
        hpal                                 as   long
end   type

private   type   rect
        left                 as   long
        top                   as   long
        right               as   long
        bottom             as   long
end   type

'   缩放图片
'   参数:源图片,新的高度,新的宽度,是否保持长宽比(默认为保持比例),保持长宽比时空白区域的填充颜色(默认为白色)
public   function   stretchpicture(byval   pic   as   stdpicture,   byval   newwidth   as   long,   byval   newheight   as   long,   optional   byval   keepscale   as   boolean   =   true,   optional   byval   fillcolor   as   ole_color   =   vbwhite)   as   stdpicture
       
        dim   lngw                         as   long           '   原始图片宽度
        dim   lngh                         as   long           '   原始图片高度
        dim   lngneww                   as   long           '   缩略图真实宽度
        dim   lngnewh                   as   long           '   缩略图真实高度
        dim   lnghdc1                   as   long           '   内存dc1
        dim   lnghdc2                   as   long           '   内存dc2
        dim   lnghdcscreen         as   long           '   屏幕dc
        dim   lngbmp                     as   long           '   新的位图句柄
        dim   lngbmpold1             as   long           '   原始位图句柄1
        dim   lngbmpold2             as   long           '   原始位图句柄2
        dim   lngbrush                 as   long           '   填充画刷
        dim   lngguid(3)             as   long
        dim   sngdw                       as   single       '   宽度缩放比
        dim   sngdh                       as   single       '   高度缩放比
        dim   objpic                     as   stdpicture
        dim   udtrect                   as   rect
        dim   udtpictdesc           as   pictdesc
       
        '   计算原始图片宽度和高度
        lngw   =   pic.width   *   1440   /   2540   /   screen.twipsperpixelx
        lngh   =   pic.height   *   1440   /   2540   /   screen.twipsperpixelx
       
        '   创建两个兼容于屏幕的内存dc
        lnghdcscreen   =   getdc(0)
       
        lnghdc1   =   createcompatibledc(lnghdcscreen)
        lnghdc2   =   createcompatibledc(lnghdcscreen)
       
        '   创建新的位图
        lngbmp   =   createcompatiblebitmap(lnghdcscreen,   newwidth,   newheight)
       
        '   将位图加入到dc中
        lngbmpold1   =   selectobject(lnghdc1,   pic.handle)
        lngbmpold2   =   selectobject(lnghdc2,   lngbmp)
       
        lngneww   =   newwidth
        lngnewh   =   newheight
       
        if   keepscale   then
               
                '   设置缩略图背景色
                udtrect.right   =   newwidth
                udtrect.bottom   =   newheight
               
                lngbrush   =   createsolidbrush(fillcolor)
                fillrect   lnghdc2,   udtrect,   lngbrush
                deleteobject   lngbrush
               
                '   计算长宽缩放比
                sngdw   =   newwidth   /   lngw
                sngdh   =   newheight   /   lngh
               
                '   缩放比使用较小的一个,计算实际图片大小
                if   sngdw   <   sngdh   then
                        lngnewh   =   lngh   *   sngdw
                else
                        lngneww   =   lngw   *   sngdh
                end   if
               
        end   if
       
        '   设置缩放模式,该模式将影响处理速度和生成图片的质量
        setstretchbltmode   lnghdc2,   stretch_halftone
        stretchblt   lnghdc2,   (newwidth   -   lngneww)   /   2,   (newheight   -   lngnewh)   /   2,   lngneww,   lngnewh,   lnghdc1,   0,   0,   lngw,   lngh,   vbsrccopy
       
        '   将位图转换成   stdpicture   对象
        udtpictdesc.size   =   len(udtpictdesc)
        udtpictdesc.type   =   vbpictypebitmap
        udtpictdesc.hbmporicon   =   lngbmp
        udtpictdesc.hpal   =   0
       
        lngguid(0)   =   &h7bf80980
        lngguid(1)   =   &h101abf32
        lngguid(2)   =   &haa00bb8b
        lngguid(3)   =   &hab0c3000
       
        olecreatepictureindirect   udtpictdesc,   lngguid(0),   true,   objpic
       
        selectobject   lnghdc1,   lngbmpold1
        selectobject   lnghdc2,   lngbmpold2
       
        '   释放gdi对象
        deletedc   lnghdc1
        deletedc   lnghdc2
        releasedc   0,   lnghdcscreen
       
        set   stretchpicture   =   objpic
       
end   function

private   sub   command1_click()
       
        set   picture2.picture   =   stretchpicture(picture1.picture,   512,   512,   true,   vbblack)
               
end   sub
发表于:2007-03-25 12:14:205楼 得分:0
to_fj182(阿花)   ::
你好,看到你的代码了,非常不错..但是有个问题,,缩小了比例的图的空间,反而比源图占的空间大了..比如:源图是20k,按比例缩小了一半后,生成的jpg反而是78k,,有什么办法嘛...我查了一些资料,这个jgp好像跟bmp格式一样..所以占用空间比较大.
发表于:2007-03-25 12:36:196楼 得分:0
to-njstalk(春意浓浓)   :

非常感谢你的回复..这个方法,我也知道..保存完的jpg文件,宽度*高度   有时不能成比例..因为我的宽度是要缩成固定的值..
发表于:2007-03-25 17:21:097楼 得分:5
//按比例缩小了一半后,生成的jpg反而是78k  
你是如何生成的,要知道vb的   savepicture是按照bmp的结构保存的,即使你在保存时所使用的后缀名是.jpg
保存为jpg格式的图片是后好几个选项可以做的,如图片质量等。
发表于:2007-03-25 21:02:388楼 得分:2
我的代码是缩放图片用的,用savepicture方法只能保存成   bmp   格式的,可以把bmp格式再转换成jpg格式。
发表于:2007-03-26 00:34:239楼 得分:1
如果生成文件反而大了,那就用jpg算法压缩下.看看。
发表于:2007-03-26 00:52:2110楼 得分:40
http://blog.csdn.net/online/archive/2005/07/13/424411.aspx

参考以下
发表于:2007-03-26 11:02:1911楼 得分:0
谢谢大家的支持,,结贴....


快速检索

最新资讯
热门点击