请问如果读取一个jpg图片的分辨率(宽、高)?谢谢

xld2001 2015-01-15 04:50:15
请问如果读取一个jpg图片的分辨率(宽、高)?谢谢
...全文
2133 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
xld2001 2015-02-07
  • 打赏
  • 举报
回复
LoadPicture这个vfp函数不好吗
老瓷 2015-02-07
  • 打赏
  • 举报
回复
22、23楼的方式比较通用,缺点是需要附带一个MyImg.Fll。 当然如果你是在用_GdiPlus.Vcx处理图形时,则该Vcx也有获得宽、高度的方法,同时也能获得分辨率。
xilaianzxsc 2015-01-31
  • 打赏
  • 举报
回复
引用 5 楼 dkfdtf 的回复:
一个问题请教楼主: 当今网络用词中,“如何”和“如果”已经通用(通假)了吗? 见过很多帖子都不用“如何”而用“如果”,不可能全都是笔误吧,是我老朽?out了?
夜猫老师真是细心,我也经常把这二个词,打错. 纯属笔误. 这二个词,不可能通假. 一个意思是why,一个意思是if ,这差距也太大了.
都市夜猫 2015-01-31
  • 打赏
  • 举报
回复
主要是遇到的太多,以至对自己的中文理解能力产生怀疑,最近发现看不懂的帖子越来越多。 ps: why 改为 how 或 how to 可能好点
dfwxj 2015-01-26
  • 打赏
  • 举报
回复
yImg.Fll图像处理函数库 * MyImg.fll * 主要功能:抓屏、裁剪、缩放、旋转、格式转换、生成到变量、复制到剪贴板 * 作者:木瓜: * 2007-07-14 * 调用顺序:ImgOpen() --> 其它函数 -->ImgClose() ,发生错误时,使用ImgGetLastError读取错误 #define _FROM_SCREEN 1 #define _FROM_CLIPBORD 2 #define _IMG_BMP 1 #define _IMG_GIF 2 #define _IMG_JPG 3 #define _IMG_PNG 4 #define _IMG_TIF 5 Clear Set Library To myImg * 1. 打开图像 屏幕、剪贴板 hImg = ImgOpen(_FROM_SCREEN) &&打开屏幕 * hImg = ImgOpen(_FROM_CLIPBORD) &&打开剪切板 * hImg = ImgOpen( cFileName ) &&打开图像 If hImg==\"\" MessageBox(\"打开图像失败!\") Return EndIf ImgSave(hImg,\"1原始图.bmp\",_IMG_BMP) * 2. 取得图像大小 ?\"宽度:\",ImgGetWidth(hImg) ?\"高度:\",ImgGetHeight(hImg) * 3. 裁剪 ImgCrop(参数:句柄,左,上,宽,高) If not ImgCrop(hImg,10,10,500,300) &&(从(10,10)坐标开始,生成一个宽500,高300的图像 MessageBox(ImgGetLastError(hImg),\"裁剪失败!\") EndIf ImgSave(hImg,\"3裁剪后.bmp\",1) * 4. 缩放 ImgZoom(句柄,新宽度,新高度) If not ImgZoom(hImg,400,400) &&缩放到400×400的图像 MessageBox(ImgGetLastError(hImg),\"缩放失败!\") EndIf ImgSave(hImg,\"4缩放后.bmp\",1) * 5.旋转 ImgRotate(句柄,角度) If not imgRotate(hImg,90) MessageBox(ImgGetLastError(hImg),\"旋转失败!\") EndIf ImgSave(hImg,\"5旋转后.bmp\",1) * 6.格式转换 If not ImgSave(hImg,\"6格式转换.png\",_IMG_PNG) &&第二个参数为文件名,第三个为图片类型 MessageBox(ImgGetLastError(hImg),\"格式转换失败!\") EndIf * 7. 如果要转JPG,可以设jpg的品质 1-100 ImgSetJpegQuality(hImg,70) &&设置jpg的品质 If not ImgSave(hImg,\"7格式转换.jpg\",_IMG_JPG) MessageBox(ImgGetLastError(hImg),\"另存为失败!\") EndIf * 8. 复制到剪贴版 If ImgCopyToClipbord(hImg) MessageBox(\"已复制到剪贴板,可以打开画图程序粘贴\") Else MessageBox(ImgGetLastError(hImg),\"复制到剪贴板失败!\") EndIf * 9.直接取得图像内容到变量(返回的是一个变量,可直接存入数据库) vImgSrc = ImgGetPtr(hImg,_IMG_GIF) &&获取Gif格式的图像内容 StrToFile(vImgSrc,\"9使用内存变量.gif\") * 10.关闭图像 ImgClose(hImg) * 11.从内存变量中创建 ( vImgSrc是前面生成的,也可以用FileToStr取得 hImg2=ImgOpen(vImgSrc,_IMG_GIF) If hImg2==\"\" MessageBox(ImgGetLastError(hImg),\"从变量打开图像失败!\") Return EndIf * 12.与Vfp9的PictureVal结合使用,ImgGetPtr()的返回值可直接赋给PictureVal If Val(_vfp.Version) >=9 Local oForm as Form oForm=CreateObject(\"form\") oForm.AddObject(\"image\",\"image\") With oForm.image as Image .Visible=.t. .PictureVal = ImgGetPtr(hImg2,_IMG_TIF) && 把格式转为tif,赋给image控件的PictureVal EndWith oForm.Show(1) EndIf *13.获取DPI ?\"DPI:\",ImgGetXDpi(hImg),ImgGetYDpi(hImg) ImgClose(hImg2) * 14 灰度 hImg=ImgOpen(_FROM_SCREEN) ImgSetGray(hImg) ImgSave(hImg,\"灰度处理后的屏幕.gif\",_IMG_TIF) ImgClose(hImg) * 15 帧操作多页tif和动画gif均可这么操作: cFile=\"fox.gif\" &&这是一个动画 hImg=ImgOpen(cFile) If hImg==\"\" MessageBox(\"无法打开图像!\") Return EndIf *取得帧数 nFrames=ImgGetFramesCount(hImg) ?\"此文件共有帧数:\",nFrames ImgClose(hImg) &&关闭 *取得每一帧 For x=1 to nFrames hImg=ImgOpen(cFile,0,x) &&打开第 x 帧,第二个参数可以忽略 If hImg==\"\" MessageBox(\"无法打开第\"+Transform(x)+\"帧!\") Loop EndIf ?\"正在生成第\",x,\"帧……\" ImgSave(hImg,\"Frame\"+Transform(x)+\".gif\",_IMG_GIF) ImgClose(hImg) &&每一帧是一个单独的句柄,都要关闭 EndFor Set Library To
dfwxj 2015-01-26
  • 打赏
  • 举报
回复
使用MYIMG.FLL绝对棒!
xuzuning 2015-01-17
  • 打赏
  • 举报
回复
回马枪 2015-01-17
  • 打赏
  • 举报
回复
4楼代码是面向过程的 14楼的代码是面向对象的
lygcw9602 2015-01-17
  • 打赏
  • 举报
回复
但4楼代码的运行速度较14楼的快
都市夜猫 2015-01-17
  • 打赏
  • 举报
回复
baidu 老师提供了这么多的方法,让人打开眼界!就其中的利弊,谈谈我的看法吧: 1. 使用 LoadPicture 函数:vfp 原生函数,缺点是其调用 IPicture 接口的方式有缺失,因此有些图片格式不被支持,例如常见的 png 格式,我的应用程序中,95%以上的图标都是 png 格式,只有这种格式的图片才支持 alpha 效果(俗称半透明或反锯齿),在 vfp 中能够得到最好的效果,xp 样式的 ico 格式虽然也支持 alpha 层,但在 vfp 中使用效果不佳。因此,此方法已被抛弃。 2. Shell.Application 对象:由于是调用 Windows 外壳的功能,所以只要 Windows 支持的功能,都可以使用。应该说这是最佳的方法。 3. WIA 驱动:WinMe 以后版本提供的方法,主要用于图像处理,不同 Windows 版本提供的 WIA 驱动不完全兼容,另一个问题是克隆版的 Windows 很多没有安装此驱动,所以要使用此方法,需要在安装包中加入此驱动的数种 Windows 版本。以前在一个项目中最初就是使用方法来完成影像处理的,比较麻烦。仅就为获取图片维度而使用此方法,则弊大于利。
lygcw9602 2015-01-17
  • 打赏
  • 举报
回复
引用 14 楼 zyg8108 的回复:

cImg = Getpict()   && 获取 bmp, jpg, gif

xImgObj = LoadPicture(cImg)
With xImgObj
    lnWidth = Int(.Width/26.458)
    lnHeight = Int(.Height/26.458)
Endwith

Messagebox("宽度 = " + Transform(lnWidth) + "(像数)" + Chr(13) + ;
    "高度 = " + Transform(lnHeight) + "(像数)")
老师的方法太多了 http://www.mzvfp.com/read.php?tid=97517&page=1
lygcw9602 2015-01-17
  • 打赏
  • 举报
回复
现在看来是14楼老师的方法好,易懂,易操作。
lygcw9602 2015-01-17
  • 打赏
  • 举报
回复
baidu.com老师 像素
xld2001 2015-01-17
  • 打赏
  • 举报
回复
我测都是一样的,那个方法更好?
回马枪 2015-01-17
  • 打赏
  • 举报
回复

cImg = Getpict()   && 获取 bmp, jpg, gif

xImgObj = LoadPicture(cImg)
With xImgObj
    lnWidth = Int(.Width/26.458)
    lnHeight = Int(.Height/26.458)
Endwith

Messagebox("宽度 = " + Transform(lnWidth) + "(像数)" + Chr(13) + ;
    "高度 = " + Transform(lnHeight) + "(像数)")
lygcw9602 2015-01-17
  • 打赏
  • 举报
回复
还是猫老师的代码使用稳定 测试了xuzuning版主的方法 偏移 3732 宽 320 高 240 结果是对的
都市夜猫 2015-01-17
  • 打赏
  • 举报
回复
有了 xuzuning 版主提供的这个 jpg 文件结构,算法也就很清晰了
需要先读入 jpg 图片的文件头(最大 65533 字节),找到 SOF0 段的开始位置,再加上 4,就是高、宽描述字节的偏移值
由于 SOF0 段之前可能还存在其它的段,所以偏移值不是固定的,只是大多数会是 163
fn = GetPict('jpg')
fp = FOPEN(fn)
If fp > 0
cHeader = Fread(fp, 65533)
nSOF0 = At(0hffc0, m.cHeader)
If nSOF0 > 0
FSEEK(fp, nSOF0 + 4)
? '文件', fn
? '偏移', nSOF0 + 4
? '高度', ASC(FREAD(fp, 1)) * 256 + ASC(FREAD(fp, 1))
? '宽度', ASC(FREAD(fp, 1)) * 256 + ASC(FREAD(fp, 1))
EndIf
FCLOSE(fp)
EndIf
都市夜猫 2015-01-16
  • 打赏
  • 举报
回复
一个问题请教楼主: 当今网络用词中,“如何”和“如果”已经通用(通假)了吗? 见过很多帖子都不用“如何”而用“如果”,不可能全都是笔误吧,是我老朽?out了?
都市夜猫 2015-01-16
  • 打赏
  • 举报
回复
可靠点的方法是让 vfp 自己装载图片,并告诉我们图片的大小,我们不用去考虑不同格式图片的存储格式:

cc = Sys(2015)
_Screen.NewObject(cc, 'Image')
With GetPem(_Screen, cc) as Image
.Picture = GetPict()
? '图片宽度', .Width
? '图片高度', .Height
EndWith
_Screen.RemoveObject(cc)
都市夜猫 2015-01-16
  • 打赏
  • 举报
回复
fseek 用法没问题,没有第3个参数,则使用默认值0,代表从文件开始的绝对偏移值,另外两个有效的值是1和2,分别代表当前指针的相对偏移值和文件尾的绝对偏移值。问题是这个偏移值是否是固定不变的,没时间去查 jpg/jpeg 文件格式的规范
加载更多回复(7)

2,726

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧