pb中获取图片尺寸,通过读取头文件的方式,为什么有的可以读取到,有的不行呢?同样是jpeg文件!

anny 2011-02-23 07:56:37
pb中获取图片尺寸,通过读取头文件的方式,为什么有的可以读取到,有的不行呢?同样是jpeg文件!
$PBExportHeader$of_getpicturesize.srf
global type of_getpicturesize from function_object
end type

forward prototypes
global function integer of_getpicturesize (string as_filename, ref long al_picturewidth, ref long al_pictureheight)
end prototypes

global function integer of_getpicturesize (string as_filename, ref long al_picturewidth, ref long al_pictureheight);//====================================================================
// 函数: of_getpicturesize()
//--------------------------------------------------------------------
// 描述: 获得图片文件的图像尺寸大小(支持GIF,JPG,BMP格式)
//--------------------------------------------------------------------
// 参数:
// value string as_FileName 图片文件名称
// reference long al_PictureWidth 返回图片宽度
// reference long al_PictureHeight 返回图片高度
//--------------------------------------------------------------------
// 返回值: integer 1 - 成功,0 - 失败
//--------------------------------------------------------------------

Integer li_File, li_DataRead
Blob lb_Data
Long ll_FileLength,ll_PictureWidth,ll_PictureHeight
Long ll_DataLen,ll_DataPos,ll_FilePos
Boolean lb_LoopFlag = True
byte lc_Char1,lc_Char2
//文件不存在
If Not FileExists(as_FileName) Then Return 0
//取文件大小
ll_FileLength = FileLength(as_FileName)
//打开文件
li_File = FileOpen(as_FileName,StreamMode!)
If li_File = -1 Then Return 0
//读取文件
li_DataRead = FileRead(li_File,lb_Data)
If li_DataRead <= 0 Then
FileClose(li_File)
Return 0
End If
// GIF目前主要有两种类型
// 1. 标识为GIF87a, 只是用来存储单幅静止图像
// 2. 标识为GIF89a, 可以同时存储若干幅静止图像并进而形成连续的动画
// 文件的前 6 个字节为标识:GIF87a 或 GIF89a, 第 7,8 字节为图像宽度(width),
// 第 9,10 字节为图像高度(height), 注意两个字节中低位在前
// GIF 文件格式判断
If String(BlobMid(lb_Data,1,4)) = 'GIF8' Then
ll_PictureWidth = byte(BlobMid(lb_Data,7,1)) + byte(BlobMid(lb_Data,8,1)) * 256
ll_PictureHeight = byte(BlobMid(lb_Data,9,1)) + byte(BlobMid(lb_Data,10,1)) * 256
If ll_PictureWidth > 0 And ll_PictureHeight > 0 Then
al_PictureWidth = ll_PictureWidth
al_PictureHeight = ll_PictureHeight
FileClose(li_File)
Return 1
Else
FileClose(li_File)
Return 0
End If
End If

// JPEG文件格式
// 前 3 个字节为标识: 0xFF,0xD8,0xFF
// messagebox("ll_DataPos",ll_DataPos);
//If BlobMid(lb_Data,1,3) = Char(255)+Char(216)+Char(255) Then
if byte(BlobMid(lb_Data,1,1)) = 255 and byte(BlobMid(lb_Data,2,1)) = 216 and byte(BlobMid(lb_Data,3,1)) = 255 then
ll_DataLen= Len(lb_Data)
ll_DataPos=3
ll_FilePos = 3
Do While lb_LoopFlag
ll_DataPos = ll_DataPos +1;
ll_FilePos = ll_FilePos + 1;
lc_Char1 = byte(BlobMid(lb_Data,ll_DataPos,1));
lc_Char2 = byte(BlobMid(lb_Data,ll_DataPos+1,1));
//messagebox("ll_DataPos2",ll_DataPos);
If lc_Char1= 255 And lc_Char2 <> 255 Then
If lc_Char2 >= 192 And lc_Char2 <= 195 Then
//找到尺寸数据
ll_PictureWidth= byte(BlobMid(lb_Data,ll_DataPos+7,1))*256+byte(BlobMid(lb_Data,ll_DataPos+8,1));
ll_PictureHeight= byte(BlobMid(lb_Data,ll_DataPos+5,1))*256 + byte(BlobMid(lb_Data,ll_DataPos+6,1));
lb_LoopFlag= False;
Else
//没有找到尺寸数据,重新读取文件
// messagebox(" byte(BlobMid(lb_Data,ll_DataPos+3,1))", byte(BlobMid(lb_Data,ll_DataPos+ 3,1)));
//messagebox(" byte(BlobMid(lb_Data,ll_DataPos+2,1))", byte(BlobMid(lb_Data,ll_DataPos + 2,1)));
//ll_FilePos = ll_FilePos + byte(BlobMid(lb_Data,ll_DataPos+ 3,1)) * 256 + byte(BlobMid(lb_Data,ll_DataPos+ 2,1)) + 1;
ll_FilePos = ll_FilePos + byte(BlobMid(lb_Data,ll_DataPos+ 3,1)) + byte(BlobMid(lb_Data,ll_DataPos+ 2,1)) + 1;
// messagebox("ll_FilePos",ll_FilePos);
// messagebox("ll_FileLength",ll_FileLength);
If ll_FilePos > ll_FileLength Then
FileClose(li_File)
Return 0
Else
FileSeek(li_File,ll_FilePos)
FileRead(li_File,lb_Data)
ll_DataLen = Len(lb_Data)
ll_DataPos = 0
End If
End If
End If

If ll_DataPos = ll_DataLen - 9 And lb_LoopFlag = True Then
ll_FilePos = ll_FilePos - 9
FileSeek(li_File,ll_FilePos)
FileRead(li_File,lb_Data)
ll_DataLen = Len(lb_Data)
ll_DataPos = 0
End If
If ll_FilePos >= ll_FileLength Then
lb_LoopFlag = False
End If
Loop

If ll_PictureWidth > 0 And ll_PictureHeight > 0 Then
al_PictureWidth = ll_PictureWidth
al_PictureHeight =ll_PictureHeight
FileClose(li_File)
Return 1
Else
FileClose(li_File)
Return 0
End If
End If



// BMP文件格式
// 前两个字节是标识:标识可能有很多种
// 第 19,20,21,22 字节为宽度(width), 第 23,24,25,26 字节为高度(height)
// 四个字节组成dword, 低位在前
//If String(BlobMid(lb_Data,1,2)) = 'BM' Then
if byte(BlobMid(lb_Data,1,1)) = asc('B') and byte(BlobMid(lb_Data,2,1)) = asc('M') then
ll_PictureWidth = byte(BlobMid(lb_Data,19,1)) + byte(BlobMid(lb_Data,20,1)) * 256 + byte(BlobMid(lb_Data,21,1)) * 65536 + byte(BlobMid(lb_Data,22,1)) * 16777216
ll_PictureHeight = byte(BlobMid(lb_Data,23,1)) + byte(BlobMid(lb_Data,24,1)) * 256 + byte(BlobMid(lb_Data,25,1)) * 65536 + byte(BlobMid(lb_Data,26,1)) * 16777216
If ll_PictureWidth > 0 And ll_PictureHeight > 0 Then
al_PictureWidth = ll_PictureWidth
al_PictureHeight = ll_PictureHeight
////将图像的真实大小转换为PBUnit大小,并返回
//al_PictureWidth = PixelsToUnits(ll_PictureWidth,XPixelsToUnits!)
//al_PictureHeight = PixelsToUnits(ll_PictureHeight,YPixelsToUnits!)
FileClose(li_File)
Return 1
Else
FileClose(li_File)
Return 0
End If
End If
Return 0

end function

...全文
210 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
my_aa 2011-02-24
  • 打赏
  • 举报
回复
使用GDI+的Image::GetHeight()和Image::GetWidth()
anny 2011-02-24
  • 打赏
  • 举报
回复
怎么获取jpg图片的版本?
anny 2011-02-24
  • 打赏
  • 举报
回复
那怎么办啊?
pb8 2011-02-24
  • 打赏
  • 举报
回复
jpeg的压缩方式不止一种,只有推荐使用的压缩规范而没有一个统一的,不像bmp一样能够通用的,不同的压缩标准其内部表示会有差异,所以在有些系统对bmp支持很好全jpeg支持不好~~
njwup 2011-02-24
  • 打赏
  • 举报
回复
图片尺寸的单位是什么?像素、厘米还是英吋呢?
anny 2011-02-24
  • 打赏
  • 举报
回复
用pb还有更好的方法吗?急啊!
make是在1977年在贝尔实验室(Bell Labs)研发的 Unix系统的一款依赖关系检查工具程序(Utility software)。make的应用非常广泛,它被用来构建 C、C++ 、Pascal  Fortran 等项目,自动化构建生成可执行文件或者库文件。make通过读取Makefile文件以自动化建构软件, 它会根据依赖文件的修改时间进行判断。确定一个target的依赖关系,然后把生成这个target的相关命令传给shell去执行。GNU make 和大多数版本的 make 之间最重要的区别是 GNU make 是自由软件,常和GNU编译系统一起被使用,是大多数GNU Linux安装的一部分。GNU make 在 makefile 具有许多强大的功能,超出了其他 make 版本的功能,它还可以重新生成、使用、然后删除不需要保存的文件。GNU make 还有一些非常方便的简单功能。例如,选项“假装源文件文件没有更改,即使它已更改。当您向文件添加新宏时,这非常有用。大多数版本的 make 都会假设它们必须重新编译所有使用文件的源文件,但是如果您知道对文件的更改不需要重新编译 GNU make 为您提供了一种避免重新编译的方法-o file 。 黄强老师针对零编程基础的同学,精心打磨make核心知识点,帮助你快速掌握Linux编程的make的构建!适用人群: 零基础、新手、想快速学习Linux下C、C++编程的童鞋!

397

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 非技术版
社区管理员
  • 非技术版社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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