假设你的已经得到图片大小为200*100像素。以下求得以厘米为单位的大小
debug.print Printer.ScaleX(200,vbPixels,vbCentimeters)
debug.print Printer.ScaleY(100,vbPixels,vbCentimeters)

解决方案 »

  1.   

    上面的方法得到的不是 图片打印的实际尺寸哦~ 就像我上面说的
    debug.print Printer.ScaleX(200,vbPixels,vbCentimeters)
    debug.print Printer.ScaleY(100,vbPixels,vbCentimeters)
    得到的只是图片在屏幕上的尺寸!
      

  2.   

    在论坛上看了n多天~ 发现有个Intel JPEG Library库~ 不知能否用在VB上?!其中不知有没有获得图片实际分辨率的方法?!
      

  3.   

    有没有VB爱好者的QQ群哦?哪个好心人给指条路子走哦!~郁闷中~
      

  4.   

    图像的分辨率可以用GDI+的相关函数得到。
      

  5.   

    这个不是编程问题。
    在 BMP、JPG、PNG 等图形文件中,均有一个字段用来存放这幅图片的分辨率,不过没有什么实际意义,很多都没有设置(就是说这个字段为 0),这时 Windows 的图像浏览器会显示成 96DPI 的,就是说每英寸 96 点。
    在电脑上是用的逻辑尺寸,相对于实际的物理尺寸,要稍微大一些,这是因为一般情况下眼睛距屏幕要比书远,要是1:1的话,一些小文字会看不清。
    不知楼主明白了没有,分辨率是打印时才涉及的,在 Windows 中,图像该是多少像素,就是多大。一般的打印分辨率是 300DPI,在纸面上每英寸有 300 个点,拿电脑上 1024x768 的分辨率来说,纸上 2.54cm 的长度相当于屏幕上的 300 像素,对于17英寸的显示器,这个长度是 10.12cm
      

  6.   

    回6楼~
    俺并没有那个意思啦~
    只是觉得 这应该不是特别困难的事~ 为什么都没有个明确的答案 超郁闷的!对于1楼的答案~ 算出来的并不是实际尺寸! 简单的方法~可以在PhotoShop中验证!
      

  7.   

    回7楼~
    GDI+是...(似乎只能在VC中使用... 不要笑俺~ 俺其实也在网上看过~ 还不明白它是什么东东)
      

  8.   

    我猜想应该是有这么一个字段的!!!为什么说没有设置?!我也明白分辨率关系到打印~ 但是在PhotoShop中就有图片分辨率的显示呀?
    是怎样得到的呢?!!Windows系统自带的画图程序也有啊!在 图像>属性
    Acdsee中也有!!在 文件>属性
    为什么!?
      

  9.   

    错了~ Acdsee是~ 在 文件>属性
     
      

  10.   


    Soyokaze大哥在吗?上面15楼,16楼是回10楼的~ 能说说如何得到那个字段吗?如果那个字段被设0~ 还有别的办法得到分辨率吗?!!
      

  11.   

    被设为 0,就按照缺省的 96 处理。其实对于计算机上显示的图片,这个“分辨率”实际上是没有用处的,只是在涉及到打印设备时,才有参考价值。BMP的:
    typedef struct tagBITMAPINFOHEADER{ // bmih 
        DWORD  biSize; 
        LONG   biWidth; 
        LONG   biHeight; 
        WORD   biPlanes; 
        WORD   biBitCount 
        DWORD  biCompression; 
        DWORD  biSizeImage; 
        LONG   biXPelsPerMeter; 
        LONG   biYPelsPerMeter; 

        DWORD  biClrUsed; 
        DWORD  biClrImportant; 
    } BITMAPINFOHEADER; JPEG的:
    Begin+13, 1Byte, X、Y的密度单位, 0:无单位; 1:点数/英寸; 2:点数/厘米
    Begin+14,2Bytes, 水平方向像素密度
    Begin+16,2Bytes,垂直方向像素密度PNG的:
    位于“pHYs”块,这是个可选块,就是说有的文件没有这个块。
    具体是这样的:
    Pixels per unit, X axis  4 bytes (PNG unsigned integer)
    Pixels per unit, Y axis  4 bytes (PNG unsigned integer)
    Unit specifier  1 byte:
    0  unit is unknown
    1  unit is the metre
      

  12.   

    object.ScaleX()、object.ScaleY() 就是 VB 中专门用来进行不同坐标系下的分辨率转换。在常用坐标系中(vbTwips, vbPoints, vbPixels, vbCharacters, vbInches, vbMillimeters, vbCentimeters),前4个一组为逻辑坐标、后3个一组为物理坐标,组内转换有固定的比率,组间转换则依赖于设备——即前面的 Object 对象。
    我在 1 楼用了 Printer 对象,那么结果就是默认打印机中以厘米为单位的分辨率大小。注意事项:
    ·虚拟打印机似乎与屏幕设备的换算比率是一样了。
    ·屏幕设备上换算的物理坐标值是近似的,这只要想象一下:画好一条线后,通过显示器的调节按钮可以缩放显示区的大小,那么用直尺去量这根线段的长度值也会不同。
    ·打印预览其实也是转换成屏幕坐标进行显示的,同上是近似的,所以请在纸上验证。
    ·我现在用网络打印机,调用这两个函数会出现 11 号错误 。
      

  13.   


    这个还是不行啊~ 我这么做~
    1>在PhotoShop中裁了张1英寸x1英寸 分辨率300 的图片
    2>放入picturebox控件 设autosize为true
    3>得到width=4500缇
      ScaleX(Picture1.Width, vbTwips, vbInches)
    4>返回值3.125 !!并不是我所裁的1英寸!!
      

  14.   

    看样子还是要把代码写出来啊,
    随手写的
    没做任何出错处理,很简单的东西。Private Type GdiplusStartupInput
        GdiplusVersion           As Long
        DebugEventCallback       As Long
        SuppressBackgroundThread As Long
        SuppressExternalCodecs   As Long
    End TypePrivate 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 Function GdipGetImageHorizontalResolution Lib "gdiplus" (ByVal Image As Long, resolution As Single) As Long
    Private Declare Function GdipGetImageVerticalResolution Lib "gdiplus" (ByVal Image As Long, resolution As Single) As Long
    Private Declare Function GdipLoadImageFromFile Lib "gdiplus" (ByVal FileName As Long, hImage As Long) As Long
    Private Declare Function GdipDisposeImage Lib "gdiplus" (ByVal Image As Long) As Long
    Private Function GetResolution(FileName As String, HoriResolution As Single, VertResolution As Single) As Boolean
        Dim GSI As GdiplusStartupInput
        Dim Token As Long
        Dim Image As Long
        GSI.GdiplusVersion = 1
        GdiplusStartup Token, GSI
        GdipLoadImageFromFile StrPtr(FileName), Image
        GdipGetImageHorizontalResolution Image, HoriResolution
        GdipGetImageVerticalResolution Image, VertResolution
        GdipDisposeImage Image
        GdiplusShutdown Token
    End Function
      

  15.   

    你已经假定了一个与设备无关的 DPI = 300 / 1 = 300
    而常见的 dpi = 96, 所以 300 pixels = 300 / 96 = 3.125 inches。再次强调:换算比率是设备相关的,如果你需要设备无关的固定比值就直接做乘除法好了。
      

  16.   

    难道我们用的不是中文?加载到 Image 控件中后,无论是 pixels 还是 twips 坐标,总是个定值,这不就是分辨率。
    然后安装 300 dpi 的比率换算成 inches 坐标。
      

  17.   


    我不懂GDI... 消化中...
      

  18.   

    25楼就是获取文件中的dpi信息(在文件属性\摘要中的“水平分辨率”、“垂直分辨率”)。而楼主一开始要求获得图片的打印尺寸,后来又要求 1英寸=300像素,到底要干吗?
      

  19.   


    T.T||| 并没有固定 dpi 是 300 呀~
      

  20.   

    大家不要嫌俺啰嗦~ 俺菜鸟一个~ 也第一次发帖~ 很多地方麻烦大家了~
    谢谢 laviewpbt 大哥的代码! 俺好好研究去!以后可能也要多麻烦大家了~俺会努力学习!希望俺也对论坛有所帮助!!~~鞠躬~~结贴了! 好好学学GDI去~ 谢谢大家了!!