如何获得数据库表字段中二进制图片的尺寸!

时间:2022-07-04 21:42:15
用无组件上传法,将图片保存到数据库表的soimg字段中,数据类型是长二进制。从数据库表的字段中读取显示图片时,遇到一个问题--不知道如何获得图片的尺寸(宽度和长度)。
请知道的人指点一下。谢谢!!

14 个解决方案

#1


该回复被版主删除

#2


UP

#3


?????

#4


有段stream的代码在本版faq里。。。读取图片的长宽,直接用那个就可以

#5


楼上的大哥!我找了30页也没找到。

#6


UP

#7


关注

#8


<%  
Class  possible  
 dim  aso  
 Private  Sub  Class_Initialize  
   set  aso=CreateObject("Adodb.Stream")  
   aso.Mode=3    
   aso.Type=1    
   aso.Open    
 End  Sub  
 Private  Sub  Class_Terminate  
   set  aso=nothing  
 End  Sub  
 
 Private  Function  Bin2Str(Bin)  
   Dim  I,  Str  
   For  I=1  to  LenB(Bin)  
     clow=MidB(Bin,I,1)  
     if  ASCB(clow)<128  then  
       Str  =  Str  &  Chr(ASCB(clow))  
     else  
       I=I+1  
       if  I  <=  LenB(Bin)  then  Str  =  Str  &  Chr(ASCW(MidB(Bin,I,1)&clow))  
     end  if  
   Next    
   Bin2Str  =  Str  
 End  Function  
   
 Private  Function  Num2Str(num,base,lens)  
   dim  ret  
   ret  =  ""  
   while(num>=base)  
     ret  =  (num  mod  base)  &  ret  
     num  =  (num  -  num  mod  base)/base  
   wend  
   Num2Str  =  right(string(lens,"0")  &  num  &  ret,lens)  
 End  Function  
   
 Private  Function  Str2Num(str,base)  
   dim  ret  
   ret  =  0  
   for  i=1  to  len(str)  
     ret  =  ret  *base  +  cint(mid(str,i,1))  
   next  
   Str2Num=ret  
 End  Function  
   
 Private  Function  BinVal(bin)  
   dim  ret  
   ret  =  0  
   for  i  =  lenb(bin)  to  1  step  -1  
     ret  =  ret  *256  +  ascb(midb(bin,i,1))  
   next  
   BinVal=ret  
 End  Function  
   
 Private  Function  BinVal2(bin)  
   dim  ret  
   ret  =  0  
   for  i  =  1  to  lenb(bin)  
     ret  =  ret  *256  +  ascb(midb(bin,i,1))  
   next  
   BinVal2=ret  
 End  Function  
   
 Private  Function  getImageSize(filespec)    
   dim  ret(3)  
   aso.LoadFromFile(filespec)  
   bFlag=aso.read(3)  
   select  case  hex(binVal(bFlag))  
   case  "4E5089":  
     aso.read(15)  
     ret(0)="PNG"  
     ret(1)=BinVal2(aso.read(2))  
     aso.read(2)  
     ret(2)=BinVal2(aso.read(2))  
   case  "464947":  
     aso.read(3)  
     ret(0)="GIF"  
     ret(1)=BinVal(aso.read(2))  
     ret(2)=BinVal(aso.read(2))  
   case  "535746":  
     aso.read(5)  
     binData=aso.Read(1)  
     sConv=Num2Str(ascb(binData),2  ,8)  
     nBits=Str2Num(left(sConv,5),2)  
     sConv=mid(sConv,6)  
     while(len(sConv)<nBits*4)  
       binData=aso.Read(1)  
       sConv=sConv&Num2Str(ascb(binData),2  ,8)  
     wend  
     ret(0)="SWF"  
     ret(1)=int(abs(Str2Num(mid(sConv,1*nBits+1,nBits),2)-Str2Num(mid(sConv,0*nBits+1,nBits),2))/20)  
     ret(2)=int(abs(Str2Num(mid(sConv,3*nBits+1,nBits),2)-Str2Num(mid(sConv,2*nBits+1,nBits),2))/20)  
   case  "FFD8FF":  
     do    
       do:  p1=binVal(aso.Read(1)):  loop  while  p1=255  and  not  aso.EOS  
       if  p1>191  and  p1<196  then  exit  do  else  aso.read(binval2(aso.Read(2))-2)  
       do:p1=binVal(aso.Read(1)):loop  while  p1<255  and  not  aso.EOS  
     loop  while  true  
     aso.Read(3)  
     ret(0)="JPG"  
     ret(2)=binval2(aso.Read(2))  
     ret(1)=binval2(aso.Read(2))  
   case  else:  
     if  left(Bin2Str(bFlag),2)="BM"  then  
       aso.Read(15)  
       ret(0)="BMP"  
       ret(1)=binval(aso.Read(4))  
       ret(2)=binval(aso.Read(4))  
     else  
       ret(0)=""  
     end  if  
   end  select  
   ret(3)="width="""  &  ret(1)  &"""  height="""  &  ret(2)  &""""  
   getimagesize=ret  
 End  Function  
   
 Function  readX(pic_path)  
     Set  fso1  =  server.CreateObject("Scripting.FileSystemObject")  
     Set  f1  =  fso1.GetFile(pic_path)  
     ext=fso1.GetExtensionName(pic_path)  
     select  case  ext  
         case  "gif","bmp","jpg","png":  
       arr=getImageSize(f1.path)  
       Response.Write  arr(1)  
         case  "swf"  
       arr=pp.getimagesize(f1.path)  
       Response.Write  arr(1)  
     end  select  
     Set  f1=nothing  
     Set  fso1=nothing  
 End  Function  
 
 Function  readY(pic_path)  
     Set  fso1  =  server.CreateObject("Scripting.FileSystemObject")  
     Set  f1  =  fso1.GetFile(pic_path)  
     ext=fso1.GetExtensionName(pic_path)  
     select  case  ext  
         case  "gif","bmp","jpg","png":  
       arr=getImageSize(f1.path)  
       Response.Write  arr(2)  
         case  "swf"  
       arr=pp.getimagesize(f1.path)  
       Response.Write  arr(2)  
     end  select  
     Set  f1=nothing  
     Set  fso1=nothing  
 End  Function  
End  Class  
%>  
 
例子:  
 
<!--#include  file="picXY.asp"-->  
<%  
 set  pp=new  possible  
 pp.readX("E:\work\bg.jpg")  
 pp.readY("E:\work\bg.jpg")  
%>  

#9


ASP无组件按比例缩放图片代码 


这个是faq的名字。。。

#10


TO:liuxiaoyi666(MSMVP 小猪妹荣誉马甲之八卦兔子)
    谢谢你对小妹的热情指点,可是我的问题仍然没有解决
    1、你提供的代码好像只能用来判断保存在磁盘文件夹里的图片文件的大小。而我的图片
       保存在数据库表的字段中。
    2、利用SFO对象在无组件上传时判断图片文件的大小,以及在显示磁盘文件夹里的图片时
       判断图片文件的大小。这些对我来说都不是问题。
    3、我的问题是从数据库字段中读取二进制图片数据后,用Response.BinaryWrite显示出图
       片之前,我无法获取图片的尺寸。
       没有路径,没有文件名,readX(pic_path)和readY(pic_path)函数如何使用?
    4、我又找了1个小时。CSDN的FAQ里没有《ASP无组件按比例缩放图片代码》这篇文章。

#11


我想要做的事情是,打算将数据库字段中的图片显示在一个300×300的矩形中,如果图片宽度大于长度,则设定width=300。如果图片的长度大于宽度,则设定height=300。

#12


不是的,道理是一样的。。。。只不过不是路径了,依然用stream读。。。。

你只要理解了其中的原理,这个代码能直接用。。。。稍微调整一下就是了

#13


你用ado中的getchunk

然后用stream中的write,把rs放到了一个stream中做二进制流,用如上方法做判断就可以了

#14


你好好看代码吧。。。。。。。我不是要解决你的问题,我是要告诉你用何种方法去解决

二进制流太简单了,以前我做上传组件的时候直接在组件里就写好了

#15


获得了你能干吗? 生成缩略图?
如果不是, 用JS控制. 要不然这毫无意义..
我弄过我清楚....

#1


该回复被版主删除

#2


UP

#3


?????

#4


有段stream的代码在本版faq里。。。读取图片的长宽,直接用那个就可以

#5


楼上的大哥!我找了30页也没找到。

#6


UP

#7


关注

#8


<%  
Class  possible  
 dim  aso  
 Private  Sub  Class_Initialize  
   set  aso=CreateObject("Adodb.Stream")  
   aso.Mode=3    
   aso.Type=1    
   aso.Open    
 End  Sub  
 Private  Sub  Class_Terminate  
   set  aso=nothing  
 End  Sub  
 
 Private  Function  Bin2Str(Bin)  
   Dim  I,  Str  
   For  I=1  to  LenB(Bin)  
     clow=MidB(Bin,I,1)  
     if  ASCB(clow)<128  then  
       Str  =  Str  &  Chr(ASCB(clow))  
     else  
       I=I+1  
       if  I  <=  LenB(Bin)  then  Str  =  Str  &  Chr(ASCW(MidB(Bin,I,1)&clow))  
     end  if  
   Next    
   Bin2Str  =  Str  
 End  Function  
   
 Private  Function  Num2Str(num,base,lens)  
   dim  ret  
   ret  =  ""  
   while(num>=base)  
     ret  =  (num  mod  base)  &  ret  
     num  =  (num  -  num  mod  base)/base  
   wend  
   Num2Str  =  right(string(lens,"0")  &  num  &  ret,lens)  
 End  Function  
   
 Private  Function  Str2Num(str,base)  
   dim  ret  
   ret  =  0  
   for  i=1  to  len(str)  
     ret  =  ret  *base  +  cint(mid(str,i,1))  
   next  
   Str2Num=ret  
 End  Function  
   
 Private  Function  BinVal(bin)  
   dim  ret  
   ret  =  0  
   for  i  =  lenb(bin)  to  1  step  -1  
     ret  =  ret  *256  +  ascb(midb(bin,i,1))  
   next  
   BinVal=ret  
 End  Function  
   
 Private  Function  BinVal2(bin)  
   dim  ret  
   ret  =  0  
   for  i  =  1  to  lenb(bin)  
     ret  =  ret  *256  +  ascb(midb(bin,i,1))  
   next  
   BinVal2=ret  
 End  Function  
   
 Private  Function  getImageSize(filespec)    
   dim  ret(3)  
   aso.LoadFromFile(filespec)  
   bFlag=aso.read(3)  
   select  case  hex(binVal(bFlag))  
   case  "4E5089":  
     aso.read(15)  
     ret(0)="PNG"  
     ret(1)=BinVal2(aso.read(2))  
     aso.read(2)  
     ret(2)=BinVal2(aso.read(2))  
   case  "464947":  
     aso.read(3)  
     ret(0)="GIF"  
     ret(1)=BinVal(aso.read(2))  
     ret(2)=BinVal(aso.read(2))  
   case  "535746":  
     aso.read(5)  
     binData=aso.Read(1)  
     sConv=Num2Str(ascb(binData),2  ,8)  
     nBits=Str2Num(left(sConv,5),2)  
     sConv=mid(sConv,6)  
     while(len(sConv)<nBits*4)  
       binData=aso.Read(1)  
       sConv=sConv&Num2Str(ascb(binData),2  ,8)  
     wend  
     ret(0)="SWF"  
     ret(1)=int(abs(Str2Num(mid(sConv,1*nBits+1,nBits),2)-Str2Num(mid(sConv,0*nBits+1,nBits),2))/20)  
     ret(2)=int(abs(Str2Num(mid(sConv,3*nBits+1,nBits),2)-Str2Num(mid(sConv,2*nBits+1,nBits),2))/20)  
   case  "FFD8FF":  
     do    
       do:  p1=binVal(aso.Read(1)):  loop  while  p1=255  and  not  aso.EOS  
       if  p1>191  and  p1<196  then  exit  do  else  aso.read(binval2(aso.Read(2))-2)  
       do:p1=binVal(aso.Read(1)):loop  while  p1<255  and  not  aso.EOS  
     loop  while  true  
     aso.Read(3)  
     ret(0)="JPG"  
     ret(2)=binval2(aso.Read(2))  
     ret(1)=binval2(aso.Read(2))  
   case  else:  
     if  left(Bin2Str(bFlag),2)="BM"  then  
       aso.Read(15)  
       ret(0)="BMP"  
       ret(1)=binval(aso.Read(4))  
       ret(2)=binval(aso.Read(4))  
     else  
       ret(0)=""  
     end  if  
   end  select  
   ret(3)="width="""  &  ret(1)  &"""  height="""  &  ret(2)  &""""  
   getimagesize=ret  
 End  Function  
   
 Function  readX(pic_path)  
     Set  fso1  =  server.CreateObject("Scripting.FileSystemObject")  
     Set  f1  =  fso1.GetFile(pic_path)  
     ext=fso1.GetExtensionName(pic_path)  
     select  case  ext  
         case  "gif","bmp","jpg","png":  
       arr=getImageSize(f1.path)  
       Response.Write  arr(1)  
         case  "swf"  
       arr=pp.getimagesize(f1.path)  
       Response.Write  arr(1)  
     end  select  
     Set  f1=nothing  
     Set  fso1=nothing  
 End  Function  
 
 Function  readY(pic_path)  
     Set  fso1  =  server.CreateObject("Scripting.FileSystemObject")  
     Set  f1  =  fso1.GetFile(pic_path)  
     ext=fso1.GetExtensionName(pic_path)  
     select  case  ext  
         case  "gif","bmp","jpg","png":  
       arr=getImageSize(f1.path)  
       Response.Write  arr(2)  
         case  "swf"  
       arr=pp.getimagesize(f1.path)  
       Response.Write  arr(2)  
     end  select  
     Set  f1=nothing  
     Set  fso1=nothing  
 End  Function  
End  Class  
%>  
 
例子:  
 
<!--#include  file="picXY.asp"-->  
<%  
 set  pp=new  possible  
 pp.readX("E:\work\bg.jpg")  
 pp.readY("E:\work\bg.jpg")  
%>  

#9


ASP无组件按比例缩放图片代码 


这个是faq的名字。。。

#10


TO:liuxiaoyi666(MSMVP 小猪妹荣誉马甲之八卦兔子)
    谢谢你对小妹的热情指点,可是我的问题仍然没有解决
    1、你提供的代码好像只能用来判断保存在磁盘文件夹里的图片文件的大小。而我的图片
       保存在数据库表的字段中。
    2、利用SFO对象在无组件上传时判断图片文件的大小,以及在显示磁盘文件夹里的图片时
       判断图片文件的大小。这些对我来说都不是问题。
    3、我的问题是从数据库字段中读取二进制图片数据后,用Response.BinaryWrite显示出图
       片之前,我无法获取图片的尺寸。
       没有路径,没有文件名,readX(pic_path)和readY(pic_path)函数如何使用?
    4、我又找了1个小时。CSDN的FAQ里没有《ASP无组件按比例缩放图片代码》这篇文章。

#11


我想要做的事情是,打算将数据库字段中的图片显示在一个300×300的矩形中,如果图片宽度大于长度,则设定width=300。如果图片的长度大于宽度,则设定height=300。

#12


不是的,道理是一样的。。。。只不过不是路径了,依然用stream读。。。。

你只要理解了其中的原理,这个代码能直接用。。。。稍微调整一下就是了

#13


你用ado中的getchunk

然后用stream中的write,把rs放到了一个stream中做二进制流,用如上方法做判断就可以了

#14


你好好看代码吧。。。。。。。我不是要解决你的问题,我是要告诉你用何种方法去解决

二进制流太简单了,以前我做上传组件的时候直接在组件里就写好了

#15


获得了你能干吗? 生成缩略图?
如果不是, 用JS控制. 要不然这毫无意义..
我弄过我清楚....