article:
tag:
just test

ASP > ASP?adodb.stream?取?.jpg?图片高宽度?By?shawl.qiu 上一篇 | 下一篇

ASP adodb.stream 取 .jpg 图片高宽度 By shawl.qiu


摘要: 
主要目的为取 .jpg/JFIF 文件 的高宽度信息, 使用ASP完成(不用外建组件).
但, 由于 .jpg/JFIF 的文件头并不是固定长度, 实现起来真的是...很难, 我都搞了好几天了, 找了一叠又一叠相关资料, 还好, 已搞定, 取个高度宽度咋就这么难呢...

作用:
本文使用 ASP 的内置组件 adodb.stream 取得 .jpg图片的相关信息, 包括高宽度信息.

目录:
1. 主内容: 完整例子

1.1 取高宽度-效率很低的正确算法
1.1 运行结果
1.1 说明

1.2 取高宽度-效率好又正确的算法
1.2 运行结果
1.2 说明

1.3 文件识别
1.3 运行结果

2. 相关测试资料
2.1 宽度大于高度的图片测试资料[a.jpg, b.jpg, c.jpg, d.jpg]
2.2 高度大于宽度的图片测试资料[e.jpg, f.jpg, g.jpg, h.jpg]

3. 测试图片
3.1 宽度大于高度的测试图片
3.2 高度大于宽度的测试图片

4. 参考文献
4.1 JPEG标准 相关文件

5. 相关文章
5.1. ASP adodb.stream 取 Win32 .bmp 图片完整文件头信息 By shawl.qiu
5.2. ASP adodb.stream 取 .gif 图片完整文件头&描述信息 By shawl.qiu
5.3. ASP adodb.stream 取 .png 图片完整文件头信息 By shawl.qiu

shawl.qiu
2006-09-21
 http://blog.csdn.net/btbtd/

1. 主内容: 完整例子

1.1 取高宽度-效率很低的正确算法
    linenum
  1. <%
  2.     dim file:file=server.MapPath("e.jpg")
  3.     dim temp
  4.     dim stm
  5.     set stm=createObject("adodb.stream")
  6.         with stm
  7.             .type = 1
  8.             .open
  9.             .loadFromFile file
  10.             temp=.read
  11.             .close
  12.         end with    
  13.     set stm=nothing
  14.     
  15.     dim i:i=1
  16.     
  17.     do
  18.         if ascB(midB(temp,i,1))=255 then
  19.             if ascB(midB(temp,i+1,1))=192 then
  20.                 if ascB(midB(temp,i+2,1))=0 then 
  21.                     if ascB(midB(temp,i+3,1))=17 and ascB(midB(temp,i+4,1))=8 and ascB(midB(temp,i+5,1))<>0 then 
  22.                         i=i+5
  23.                         exit do
  24.                     end if
  25.                 end if
  26.             end if
  27.         end if
  28.         i=i+1
  29.     loop
  30.     dim j:j=i
  31.         response.write "position: "&j&" height: "&ascB(midB(temp,j,1))*256+ascB(midB(temp,j+1,1))&"<br/> "
  32.         response.write "position: "&j+2&" width: "&ascB(midB(temp,j+2,1))*256+ascB(midB(temp,j+3,1))
  33. %>

1.1 运行结果
position: 25095 height: 550
position: 25097 width: 367

1.1 说明
为什么 1.1 这个代码实现起来会很差劲, 差劲在哪个地方?
说说高宽度识别规则, 以 ASP 为例.

使用 ascB(midB(binaryStr,x,1)) 进行读取二进制流并转换为数值操作. x 为正整数, 且递增+1.
一个高宽度识别的规则数值是: 255 192 0 17 8 [高度/二个字节] [宽度/二个字节]

如果宽度大于高度, 那 1.1 就不会很慢, 因为要循环的次数通常不会超过1000.
且 255 192 0 17 8 [高度/第一个字节]!=0

如果高度大于宽度, 那 1.1 通常会慢得不可接受, 因为循环次数不会少于 4000 以内, 20000 - 30000 次最为常见, 这样就自然不可接受的慢了. 

且 255 192 0 17 8 [高度/第一个字节]==0, 结果是不对的. 
要循环到 255 192 0 17 8 [高度/第一个字节]!=0, 也就是第二个 255 192 0 17 8 才是正确的.

所以呗, 为了不影响效率, 我下决心搞好这个效率问题, 1.2 就是. 

1.2 取高宽度-效率好又正确的算法
    linenum
  1. <%
  2.     dim file:file=server.MapPath("e.jpg")
  3.     dim temp
  4.     dim stm
  5.     set stm=createObject("adodb.stream")
  6.         with stm
  7.             .type = 1
  8.             .open
  9.             .loadFromFile file
  10.             temp=.read
  11.             .close
  12.         end with    
  13.     set stm=nothing
  14.     
  15.     dim j:j=1
  16.     dim k, l
  17.     do 
  18.         do 
  19.             k=ascB(midB(temp,j,1))
  20.             j=j+1
  21.         loop while k=255
  22.             l=j+1
  23.         if ascB(midB(temp,l,1))=192 then 
  24.             exit do 
  25.         else
  26.             if ascB(midB(temp,l-1,2))<>255 then
  27.                 l=j-1
  28.             end if
  29.             j=l+binToNum_(midB(temp,l+1,2))
  30.         end if
  31.     loop
  32.         j=j+5
  33.     response.write "position: "&j&" height:"&binToNum_(midB(temp,j,2))&"<br/>"
  34.     response.write "position: "&j+2&" width:"&binToNum_(midB(temp,j+2,2))&"<br/>"
  35.     
  36.     private function binToNum_(bin)
  37.     '二进制转为 Numeric (png|jpg)
  38.         dim i:binToNum_=0
  39.         for i=1 to lenB(bin)
  40.             binToNum_=binToNum_*256+ascB(midB(bin,i,1))
  41.         next 'shawl.qiu'
  42.     end function
  43. %>

1.2 运行结果
position: 25095 height:550
position: 25097 width:367

1.2 说明
这个我不打算说明了, 虽然程序看起来就那么一点, 不过要说清这个问题没一千字是不可能的, 这我就偷懒呗.

1.3 文件识别
    linenum
  1. <%
  2.     dim file:file=server.MapPath("e.jpg")
  3.     dim temp
  4.     dim stm
  5.     set stm=createObject("adodb.stream")
  6.         with stm
  7.             .type = 1
  8.             .open
  9.             .loadFromFile file
  10.             temp=.read
  11.             .close
  12.         end with    
  13.     set stm=nothing
  14.     
  15.     response.write "#1-2/2 JPEG 文件开始标志 FFD8: "
  16.     response.write hex(binToNum_(midB(temp,1,2)))
  17.     response.write "<br/>"
  18.     response.write "#7-10/4 JFIF 标志: "&binToStr(midB(temp,7,4))
  19.     
  20.     private function binToStr(bin)
  21.     '二进制转为 string (bmp|gif|png|jpg)
  22.         dim i, iByt, sByt, bLen:bLen=lenB(bin)
  23.         for i=1 to bLen
  24.             sByt=midB(bin,i,1):iByt=ascB(sByt)
  25.             if iByt<128 then
  26.                 binToStr=binToStr&chr(iByt)
  27.             else:i=i+1
  28.                 if i<=bLen then binToStr=binToStr&chr(ascW(sByt&sByt))
  29.             end if
  30.         next 'shawl.qiu'
  31.     end function
  32.     
  33.     private function binToNum_(bin)
  34.     '二进制转为 Numeric (png|jpg)
  35.         dim i:binToNum_=0
  36.         for i=1 to lenB(bin)
  37.             binToNum_=binToNum_*256+ascB(midB(bin,i,1))
  38.         next 'shawl.qiu'
  39.     end function
  40. %>
 
1.3 运行结果
#1-2/2 JPEG 文件开始标志 FFD8: FFD8
#7-10/4 JFIF 标志: JFIF

2. 相关测试资料

2.1 宽度大于高度的图片测试资料[a.jpg, b.jpg, c.jpg, d.jpg]
URL:   http://files.myopera.com/btbtd/web/h17_width_g.htm

2.2 高度大于宽度的图片测试资料[e.jpg, f.jpg, g.jpg, h.jpg]
URL:   http://files.myopera.com/btbtd/web/h17_height_g.htm

3. 测试图片

3.1 宽度大于高度的测试图片
Green Institute

Green Institute

Green Institute

Green Institute

3.2 高度大于宽度的测试图片
Green Institute

Green Institute

Green Institute

Green Institute

4. 参考文献
JPEG File Interchange Format File Format Summary
http://www.fileformat.info/format/jpeg/

Decoding the file JPEG format
http://www.codeproject.com/bitmap/iptc.asp

4.1 JPEG标准 相关文件
http://www.w3.org/Graphics/JPEG/itu-t81.pdf
http://www.w3.org/Graphics/JPEG/jfif3.pdf
http://www.jpeg.org/public/jfif.pdf

5. 相关文章:
5.1. ASP adodb.stream 取 Win32 .bmp 图片完整文件头信息 By shawl.qiu
URL: http://blog.csdn.net/btbtd/archive/2006/09/16/1228908.aspx

5.2. ASP adodb.stream 取 .gif 图片完整文件头&描述信息 By shawl.qiu
URL: http://blog.csdn.net/btbtd/archive/2006/09/17/1232530.aspx

5.3. ASP adodb.stream 取 .png 图片完整文件头信息 By shawl.qiu
URL: http://blog.csdn.net/btbtd/archive/2006/09/17/1232943.aspx

@suches
http://btbtd.com/mods/blog/item.php?uid=1&item=3813

发表于 @ 2006-09-21 08:00:00

该文章暂时没有回复
评论内容:
昵称:
验证码: