当前位置:编程学习 > VB >>

关于Image或Picture控件改变图片像素大小的问题

有一图片大小为450x600像素
在Image控件中加载图片以后,如果控件比图片小,比如控件大小转换为像素是150x200,那么图片会非常模糊,如果在PS中将原始图片大小改为150x200像素,那么在Image控件中就比较清楚了


问:有什么方法直接在Image或Picture控件中将图片大小改变,比如说原始图片为450x600像素,在Image控件中加载的图片更改为150x200,有什么好的方法或者思路呢 


望各位大神支支招
--------------------编程问答-------------------- Image的Stretch属性,图片自动适应控件大小,picturebox的AutoSize属性,控件自动适应图片大小,楼主可以试试。 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 缩小的话,一般是不会模糊的. 你把原图和缩小的图贴出来看看 --------------------编程问答--------------------
引用 3 楼 WallesCai 的回复:
缩小的话,一般是不会模糊的. 你把原图和缩小的图贴出来看看


支持,的确可能是某些类型的图片缩小时很需要优化的缩放算法。 --------------------编程问答--------------------
引用 4 楼 bcrun 的回复:
引用 3 楼 WallesCai 的回复:缩小的话,一般是不会模糊的. 你把原图和缩小的图贴出来看看

支持,的确可能是某些类型的图片缩小时很需要优化的缩放算法。


使得,有些比较特殊的照片确实会在缩小的时候变得"模糊", 原因在于其原始照片中比较"细小"的关键点在缩小的过程中被丢弃了. 
举个极端的例子: 比如原来的照片展示了几根头发, 然后一缩小, 头发变成断断续续的东西了, 因为中间的某些部分被"缩"掉了.

象StrichBlt这种"无脑缩放"就会发生上面这种"悲剧". 如果不想这样的话, 要自己写算法, 在去掉被"缩"掉的点之前先做判断. 不过速度上会比较慢一点, 并且保留下来的"细节"会带有误差,"(这取决于你使用色彩叠加"还是直接保留原像素等不同的算法了.) --------------------编程问答-------------------- 用GDI+函数失真会比较小:

Public Sub PreviewfromGdi(TempPaintvalue As Single, Temphidepicture As PictureBox, Tempshowpicture As PictureBox) '缩放图像
    Dim GpInput As GdiplusStartupInput
    Dim TempIm As Long
    Dim TempGp As Long
    Dim HdcScreen As Long
    Dim hBitmap As Long
    Dim HdcMem As Long
    Dim Ret As Long
    
    DeleteDC HdcMem
    HdcScreen = GetDC(0)    ' DC
    HdcMem = CreateCompatibleDC(HdcScreen)    ' 建立 DC
    hBitmap = CreateCompatibleBitmap(HdcScreen, Temphidepicture.Width * TempPaintvalue, Temphidepicture.Height * TempPaintvalue)    ' 建立点阵图
    Ret = SelectObject(HdcMem, hBitmap)    '  hDCMem
    Rectangle HdcMem, 0, 0, Temphidepicture.Width * TempPaintvalue, Temphidepicture.Height * TempPaintvalue
    GpInput.GdiplusVersion = 1
    If GdiplusStartup(Gdip_Token, GpInput) <> Ok Then
        MsgBox "Error loading GDI+!", vbCritical
        Exit Sub
    End If
    Call GdipCreateFromHDC(HdcMem, TempGp)    '获取Graphics对象的句柄MyG,与Picture绑定
    Temphidepicture.AutoSize = True
    Call GdipCreateBitmapFromHBITMAP(Temphidepicture.Picture.Handle, 0, TempIm)    '得到一个image对象
    GdipSetInterpolationMode TempGp, 7    'SMC_HighQualityBicubic,设置压缩质量
    Call GdipDrawImageRectI(TempGp, TempIm, 0, 0, Temphidepicture.Width * TempPaintvalue, Temphidepicture.Height * TempPaintvalue)
    BitBlt Tempshowpicture.hDC, 0, 0, Tempshowpicture.Width, Tempshowpicture.Height, HdcMem, (Temphidepicture.Width * TempPaintvalue - Tempshowpicture.Width) / 2, (Temphidepicture.Height * TempPaintvalue - Tempshowpicture.Height) / 2, vbSrcCopy    '从内寸复制到图片框,居中
    Call GdipDisposeImage(TempIm)    '/////当不需要image对象的时候需要释放
    Call GdipDeleteGraphics(TempGp)    '释放Graphics
    Call GdiplusShutdown(Gdip_Token)    '关闭GDI+
    DeleteDC HdcScreen
    DeleteObject hBitmap
End Sub

API声明自己找:)
补充:VB ,  基础类
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,