整体过程是这样的我有个bmp文件,因为空间原因我把它转化成png文件形式存放现在我有个特定大小的picturebox(长和宽都是3615 twip),我的png文件尺寸比这个picturebox大
我完成了png文件显示于picturebox里面,但是由于尺寸问题无法完整显示我尝试用image控件作stretch,但是png文件显示效果比较差我的问题是,如果让一个pgn文件显示于特定大小的picturebox中且不损失图片质量呢?谢谢

解决方案 »

  1.   

    png 是怎么显示到 picturebox中的?  image 又是怎么加载的 png? 
    转换为位图之后再??我建议用gdi+的函数直接加载png,然后gdi+的函数再画到控件上
      

  2.   


    我就是这么干的,但是效果差很多。
    发贴后我也作了一些测试,觉得可能我的png缩小后就是细节缺失吧所以我放弃了我的方法
      

  3.   

    不懂,你是说png放大或缩小后图像质量没有bmp放大缩小后的质量好,还是感觉上差
      

  4.   


    Option ExplicitPrivate Declare Function GdipCreateFromHDC Lib "GdiPlus" (ByVal hdc As Long, graphics As Long) As Long
    Private Declare Function GdipDeleteGraphics Lib "GdiPlus" (ByVal graphics As Long) As Long
    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 Long
    Private Declare Function GdipGetImageWidth Lib "GdiPlus" (ByVal image As Long, Width As Long) As Long
    Private Declare Function GdipGetImageHeight Lib "GdiPlus" (ByVal image As Long, Height As Long) As Long
    Private Declare Function GdipDisposeImage Lib "GdiPlus" (ByVal image As Long) As Long
    Private Declare Function GdiplusStartup Lib "GdiPlus" (token As Long, inputbuf As GdiplusStartupInput, Optional ByVal outputbuf As Long = 0) As Long
    Private Declare Sub GdiplusShutdown Lib "GdiPlus" (ByVal token As Long)
    Private Declare Sub CreateStreamOnHGlobal Lib "ole32.dll" (ByRef hGlobal As Any, ByVal fDeleteOnRelease As Long, ByRef ppstm As Any)
    Private Declare Function GdipLoadImageFromStream Lib "GdiPlus" (ByVal Stream As Long, ByRef image As Long) As LongPrivate Type GdiplusStartupInput
       GdiplusVersion As Long
       DebugEventCallback As Long
       SuppressBackgroundThread As Long
       SuppressExternalCodecs As Long
    End TypePrivate Sub Command1_Click()Dim GpInput As GdiplusStartupInput
    Dim token As Long
       GpInput.GdiplusVersion = 1
       GdiplusStartup token, GpInputDim GdiDC As Long, i() As Byte, StreamObject As Long, img As Long
    Dim lngHeight As Long, lngWidth As Long
    GdipCreateFromHDC Me.hdc, GdiDC
    i = LoadResData(101, "CUSTOM")     
    ' 这个代码是从自定义资源加载的,你可以改成从磁盘加载,自己读png数据流,把字节流数组给 i就行了
    ' 然后这个代码会把图像显示在窗口左上角
    CreateStreamOnHGlobal i(0), 0, StreamObject
    GdipLoadImageFromStream StreamObject, img 
    GdipGetImageHeight img, lngHeight    '获取图像高度
    GdipGetImageWidth img, lngWidth      ' 宽度
    Debug.Print lngHeight, lngWidth
    GdipDrawImageRect GdiDC, img, 0, 0, lngWidth, lngHeight  '这就是画图的语句
    GdipDisposeImage img
    GdipDeleteGraphics GdiDC
    GdiplusShutdown token
    End Sub
      

  5.   

    gdi+ 代码非常容易导致ide挂掉, 建议lz还是修改那个图片为其他格式吧
    比如带屏蔽色的位图,用gdi绘图,而不是gdi+, 效果应该不会差太远
      

  6.   

    gdi+ 代码非常容易导致ide挂掉是这个原因。http://www.pscode.com/vb/scripts/ShowCode.asp?txtCodeId=69434&lngWId=1
      

  7.   

    效果差是因为插值方式不好,GdipSetInterpolationMode设置为3次立方插值要好很多,但是图像上若有文字则效果无论哪种插值方式都会有瑕疵。
      

  8.   

    你的看图软件把你的PNG文件缩小后显示效果好么?
      

  9.   

    如果image控件的宽度和高度设置与原图的宽度和高度不是按比例缩小的将来到变形的图形,效果当然不会好。
      

  10.   

    应该是按照不同的大小预先制作好各种规格的图片,而不是动态缩放。
    你用资源方式打开 XP 的可视化风格文件,就会发现有些图片准备了多个规格的(比如 zune.msstyles 里的 checkbox 图片)。
      

  11.   

    关注一下.刚刚在PS里试了一下,使用的是二次立方算法进行缩小,与在画图里直接按比例缩小,效果天差地别.另外.......既然是"为了空间",那说明这图是固定的,而不是动态的,不如直接使用PS处理好大小吧..弄成高质量的JPG也不会差到哪里去的.
      

  12.   

    加载还简单.........直接loadpicture...