展开菜单
首页 精品内容 本月促销 装机必备 Windows PDF教程 macOS软件 IOS软件 Android AI 专题
全部分类

当前位置:

首页 > 编程开发 > 如何获知页面上的图象的实际尺寸?

如何获知页面上的图象的实际尺寸?

页面图像的实际尺寸因格式而异:GIF尺寸存于文件头第6至9字节,小端序存储;JPEG需定位FFC0等SOF标记段读取;PNG从IHDR数据块前8字节获取,大端序。ASP代码通过文件系统对象解析二进制文件提取宽高。

本文目录

    在Web开发中,经常会遇到这样一个问题:页面上显示的图片,实际尺寸到底是多少?虽然浏览器渲染后我们可以通过开发者工具查看,但当需要在服务端动态处理图片显示时,直接获取原始尺寸就成了一个绕不开的技术点。表面上看,这是个很简单的需求,但真要自己动手写代码去解析,里面涉及的图像格式细节还是挺有意思的。

    其实,不同图像格式的尺寸信息,存储位置和编码方式各不相同。比如GIF文件,它的宽高信息存放在文件头的第6到第9个字节,而且是以小端序(low-endian)的方式存储的。而JPEG则是另一种玩法,尺寸信息隐藏在标记段中,需要先找到FFC0或FFC1这样的SOF标记,才能准确读出宽高。PNG更直接,IHDR数据块的前八个字节就是宽高,存放方式是大端序(big-endian)。

    下面这段ASP代码,就是针对这些常见图像格式,逐一解析获取尺寸的完整实现。核心思路是利用文件系统对象(FileSystemObject)以文本方式读取二进制文件,然后根据格式规则提取关键字节,再转换成十进制。

    如何获知页面上的图像的实际尺寸?

    先看主调用的逻辑:

    
    
    
    千花飞舞之获知图像尺寸
    
    
    <%
      graphic="images/intels.gif"
      HW = ReadImg(graphic)
      Response.Write graphic & " Dimensions: " & HW(0) & "x" & HW(1) & "
    " response.write "" %>

    这段代码首先通过ReadImg函数获取图像尺寸,然后动态生成一个img标签,并设置宽高属性。注意这里有个小bug:height和width都赋了HW(0)的值,应该一个是高度一个是宽度,但这是示例代码,实际使用时需要修正。

    接下来是核心的graphicdetect.asp文件,它包含了所有格式的判断和读取函数:

    <%
    Dim HW
    
    Function AscAt(s, n)
        AscAt = Asc(Mid(s, n, 1))
    End Function
    
    Function HexAt(s, n)
        HexAt = Hex(AscAt(s, n))
    End Function
    
    Function isJPG(fichero)
        If inStr(uCase(fichero), ".JPG") <> 0 Then
            isJPG = true
        Else
            isJPG = false
        End If
    End Function
    
    Function isPNG(fichero)
        If inStr(uCase(fichero), ".PNG") <> 0 Then
            isPNG = true
        Else
            isPNG = false
        End If
    End Function
    
    Function isGIF(fichero)
        If inStr(uCase(fichero), ".GIF") <> 0 Then
            isGIF = true
        Else
            isGIF = false
        End If
    End Function
    
    Function isBMP(fichero)
        If inStr(uCase(fichero), ".BMP") <> 0 Then
            isBMP = true
        Else
            isBMP = false
        End If
    End Function
    
    Function isWMF(fichero)
        If inStr(uCase(fichero), ".WMF") <> 0 Then
            isWMF = true
        Else
            isWMF = false
        End If
    End Function
    
    Function isWebImg(f)
        If isGIF(f) Or isJPG(f) Or isPNG(f) Or isBMP(f) Or isWMF(f) Then
            isWebImg = true
        Else
            isWebImg = true
        End If
    End Function
    

    这里有一个值得注意的地方:isWebImg函数中,Else分支也返回了true,这显然是个逻辑错误,应该是false。不过对于整体功能来说,这个函数只是在主流程中做一次过滤,不太影响核心的尺寸读取。

    主分发函数ReadImg根据文件扩展名,调用对应的格式读取函数:

    Function ReadImg(fichero)
        If isGIF(fichero) Then
            ReadImg = ReadGIF(fichero)
        Else
            If isJPG(fichero) Then
                ReadImg = ReadJPG(fichero)
            Else
                If isPNG(fichero) Then
                    ReadImg = ReadPNG(fichero)
                Else
                    If isBMP(fichero) Then
                        ReadImg = ReadPNG(fichero)
                    Else
                        If isWMF(fichero) Then
                            ReadImg = ReadWMF(fichero)
                        Else
                            ReadImg = Array(0,0)
                        End If
                    End If
                End If
            End If
        End If
    End Function
    

    注意BMP格式的读取函数,这里误写成了ReadPNG,实际应该是ReadBMP。这种嵌套的If-Else结构虽然可读性差一些,但在早期ASP开发中很常见,毕竟当时没有Switch语句。

    各格式的读取函数高度相似,核心都是通过FileSystemObject打开文件,读取特定字节数,然后提取宽高数据。以GIF格式为例:

    Function ReadGIF(fichero)
        Dim fso, ts, s, HW, nbytes
        HW = Array("","")
        Set fso = CreateObject("Scripting.FileSystemObject")
        Set ts = fso.OpenTextFile(Server.MapPath("/" & fichero), 1)
        s = Right(ts.Read(10), 4)
        HW(0) = HexToDec(HexAt(s,2) & HexAt(s,1))
        HW(1) = HexToDec(HexAt(s,4) & HexAt(s,3))
        ts.Close
        ReadGIF = HW
    End Function
    

    GIF的尺寸信息位于文件头偏移6和8处,各占2个字节,小端序存储。代码中先读取文件前10个字节,然后取后4个字节,再把每两个字节合并后通过HexToDec转换成十进制。注意这里的字节顺序:HexAt(s,2) & HexAt(s,1)是对宽度的高低位做了交换,这就是小端序的处理方式。

    JPEG的读取方式略有不同,需要读取167个字节,然后取最后4个字节:

    Function ReadJPG(fichero)
        Dim fso, ts, s, HW, nbytes
        HW = Array("","")
        Set fso = CreateObject("Scripting.FileSystemObject")
        Set ts = fso.OpenTextFile(Server.MapPath("/" & fichero), 1)
        s = Right(ts.Read(167), 4)
        HW(0) = HexToDec(HexAt(s,3) & HexAt(s,4))
        HW(1) = HexToDec(HexAt(s,1) & HexAt(s,2))
        ts.Close
        ReadJPG = HW
    End Function
    

    这个读取方式比较取巧,直接假设了文件前167个字节中包含了SOF标记。对于标准的JPEG文件来说,这个假设通常是成立的,但如果文件包含大量缩略图或EXIF数据,可能会偏移。更稳健的做法应该是搜索FFC0标记,不过对于大多数场景,这个简化版本已经够用了。

    PNG和BMP的读取方式类似,都是读取前24个字节,取后8个字节。不过PNG是大端序,而BMP是小端序,代码中已经通过不同的字节组合方式处理了这一点:

    Function ReadPNG(fichero)
        Dim fso, ts, s, HW, nbytes
        HW = Array("","")
        Set fso = CreateObject("Scripting.FileSystemObject")
        Set ts = fso.OpenTextFile(Server.MapPath("/" & fichero), 1)
        s = Right(ts.Read(24), 8)
        HW(0) = HexToDec(HexAt(s,3) & HexAt(s,4))
        HW(1) = HexToDec(HexAt(s,7) & HexAt(s,8))
        ts.Close
        ReadPNG = HW
    End Function
    

    最后是辅助函数HexToDec,用于将十六进制字符串转换为十进制数。它逐字符遍历,判断每个字符是否是合法的十六进制数字,然后累加计算:

    Function HexToDec(cadhex)
        Dim n, i, ch, decimal
        decimal = 0
        n = Len(cadhex)
        For i=1 To n
            ch = Mid(cadhex, i, 1)
            If isHex(ch) Then
                decimal = decimal * 16
                If isDigit(c) Then
                    decimal = decimal + ch
                Else
                    decimal = decimal + Asc(uCase(ch)) - Asc("A")
                End If
            Else
                HexToDec = -1
            End If
        Next
        HexToDec = decimal
    End Function
    

    这里有一个小问题:If isDigit(c) Then中的c应该是ch,估计是笔误,但不影响理解。整体来看,这段代码虽然有些瑕疵,但核心思路清晰——通过文件系统直接解析二进制结构,获取图像尺寸。这在没有现代图像处理库的ASP时代,确实是一种非常实用的技术方案。

    [1]

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发
    上一篇: 图像图表
    相关文章 更多
    精品专题 更多
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    macOS软件

    正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

    IOS软件

    正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

    AI

    正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

    Mac软件 更多
    Aperty macOS版
    Aperty macOS版

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    火山引擎 网页版
    火山引擎 网页版

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    立刻MV 网页版
    立刻MV 网页版

    立刻MV 面向音乐人、内容创作者和品牌团队,帮助用户低成本完成歌曲 MV、歌词视频、AI 分镜、图生视频与最终合成。

    蛙蛙写作 网页版
    蛙蛙写作 网页版

    蛙蛙写作 AI 创作工具,覆盖小说、剧本、文案,一键生成文稿,打通文字转视频全流程,高效解决创作难题。

    讯飞智作 网页版
    讯飞智作 网页版

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    超级简历WonderCV 网页版
    超级简历WonderCV 网页版

    超级简历WonderCV是面向应届生和AI小白的智能求职平台,覆盖简历、面试与职业规划。

    音述AI 网页版
    音述AI 网页版

    音述AI,是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区。

    AionClaw macOS版
    AionClaw macOS版

    AionClaw 是可在桌面端运行的任务型 AI 助手,通过数字专家与技能市场组合办公、创作、数据和开发能力。

    Loomy macOS版
    Loomy macOS版

    Loomy 是科大讯飞推出的桌面 AI 助手,可通过对话、任务与工作目录协助处理办公、内容创作和资料整理。

    AirBuddy 3 macOS版
    AirBuddy 3 macOS版

    AirBuddy 3 是面向 macOS 的蓝牙外设增强工具,可集中查看 AirPods、Beats 与苹果设备电量,提供快速连接、播放控制、电量提醒、桌面小组件和多台 Mac 外设接力等功能。

    AirServer macOS版
    AirServer macOS版

    AirServer macOS版可把 Mac 转换为无线投屏接收端,通过 AirPlay 或 Google Cast 接收手机、平板和电脑画面,并支持多设备同时连接、高清镜像及会话录制,适合家庭娱乐、课堂教学、会议演示和应用展示。

    AnyDesk macOS版
    AnyDesk macOS版

    AnyDesk macOS版是一款适用于远程办公、设备维护和客户支持的远程桌面工具,可连接并操作异地计算机,支持文件传输、无人值守访问、会话权限控制及跨平台协作。

    WINDOWS 更多
    Maya(Autodesk Maya) Windows版
    Maya(Autodesk Maya) Windows版

    Autodesk Maya 是面向影视、电视、动画和游戏行业的专业三维制作软件,集多边形与 NURBS 建模、角色绑定、关键帧和动作捕捉动画、Bifrost 特效模拟、材质开发及 Arnold 渲染于一体,

    Aperty Windows版
    Aperty Windows版

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    火山引擎 网页版
    火山引擎 网页版

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    立刻MV 网页版
    立刻MV 网页版

    立刻MV 面向音乐人、内容创作者和品牌团队,帮助用户低成本完成歌曲 MV、歌词视频、AI 分镜、图生视频与最终合成。

    蛙蛙写作 网页版
    蛙蛙写作 网页版

    蛙蛙写作 AI 创作工具,覆盖小说、剧本、文案,一键生成文稿,打通文字转视频全流程,高效解决创作难题。

    讯飞智作 网页版
    讯飞智作 网页版

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    超级简历WonderCV 网页版
    超级简历WonderCV 网页版

    超级简历WonderCV是面向应届生和AI小白的智能求职平台,覆盖简历、面试与职业规划。

    音述AI 网页版
    音述AI 网页版

    音述AI,是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区。

    AionClaw Windows版
    AionClaw Windows版

    AionClaw 是可在桌面端运行的任务型 AI 助手,通过数字专家与技能市场组合办公、创作、数据和开发能力。

    Loomy Windows版
    Loomy Windows版

    Loomy 是科大讯飞推出的桌面 AI 助手,可通过对话、任务与工作目录协助处理办公、内容创作和资料整理。

    讯飞绘文 网页版
    讯飞绘文 网页版

    讯飞绘文网页版是科大讯飞推出的AI图文创作与内容运营工具,覆盖热点选题、文章生成、稿件校对、智能配图、排版发布和数据复盘等环节,适合自媒体创作者及内容团队在线使用。

    AirServer Windows版
    AirServer Windows版

    AirServer Windows版可把电脑变成AirPlay、Google Cast和Miracast无线投屏接收端,适合会议演示、课堂教学及家庭大屏分享。发送设备通常无需另装客户端,并可同时接收和智能排列多个镜像会话。