假设你的已经得到图片大小为200*100像素。以下求得以厘米为单位的大小
debug.print Printer.ScaleX(200,vbPixels,vbCentimeters)
debug.print Printer.ScaleY(100,vbPixels,vbCentimeters)
debug.print Printer.ScaleX(200,vbPixels,vbCentimeters)
debug.print Printer.ScaleY(100,vbPixels,vbCentimeters)
debug.print Printer.ScaleX(200,vbPixels,vbCentimeters)
debug.print Printer.ScaleY(100,vbPixels,vbCentimeters)
得到的只是图片在屏幕上的尺寸!
在 BMP、JPG、PNG 等图形文件中,均有一个字段用来存放这幅图片的分辨率,不过没有什么实际意义,很多都没有设置(就是说这个字段为 0),这时 Windows 的图像浏览器会显示成 96DPI 的,就是说每英寸 96 点。
在电脑上是用的逻辑尺寸,相对于实际的物理尺寸,要稍微大一些,这是因为一般情况下眼睛距屏幕要比书远,要是1:1的话,一些小文字会看不清。
不知楼主明白了没有,分辨率是打印时才涉及的,在 Windows 中,图像该是多少像素,就是多大。一般的打印分辨率是 300DPI,在纸面上每英寸有 300 个点,拿电脑上 1024x768 的分辨率来说,纸上 2.54cm 的长度相当于屏幕上的 300 像素,对于17英寸的显示器,这个长度是 10.12cm
俺并没有那个意思啦~
只是觉得 这应该不是特别困难的事~ 为什么都没有个明确的答案 超郁闷的!对于1楼的答案~ 算出来的并不是实际尺寸! 简单的方法~可以在PhotoShop中验证!
GDI+是...(似乎只能在VC中使用... 不要笑俺~ 俺其实也在网上看过~ 还不明白它是什么东东)
是怎样得到的呢?!!Windows系统自带的画图程序也有啊!在 图像>属性
Acdsee中也有!!在 文件>属性
为什么!?
Soyokaze大哥在吗?上面15楼,16楼是回10楼的~ 能说说如何得到那个字段吗?如果那个字段被设0~ 还有别的办法得到分辨率吗?!!
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
我在 1 楼用了 Printer 对象,那么结果就是默认打印机中以厘米为单位的分辨率大小。注意事项:
·虚拟打印机似乎与屏幕设备的换算比率是一样了。
·屏幕设备上换算的物理坐标值是近似的,这只要想象一下:画好一条线后,通过显示器的调节按钮可以缩放显示区的大小,那么用直尺去量这根线段的长度值也会不同。
·打印预览其实也是转换成屏幕坐标进行显示的,同上是近似的,所以请在纸上验证。
·我现在用网络打印机,调用这两个函数会出现 11 号错误 。
这个还是不行啊~ 我这么做~
1>在PhotoShop中裁了张1英寸x1英寸 分辨率300 的图片
2>放入picturebox控件 设autosize为true
3>得到width=4500缇
ScaleX(Picture1.Width, vbTwips, vbInches)
4>返回值3.125 !!并不是我所裁的1英寸!!
随手写的
没做任何出错处理,很简单的东西。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
而常见的 dpi = 96, 所以 300 pixels = 300 / 96 = 3.125 inches。再次强调:换算比率是设备相关的,如果你需要设备无关的固定比值就直接做乘除法好了。
然后安装 300 dpi 的比率换算成 inches 坐标。
我不懂GDI... 消化中...
T.T||| 并没有固定 dpi 是 300 呀~
谢谢 laviewpbt 大哥的代码! 俺好好研究去!以后可能也要多麻烦大家了~俺会努力学习!希望俺也对论坛有所帮助!!~~鞠躬~~结贴了! 好好学学GDI去~ 谢谢大家了!!