重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
lt;%
创新互联建站为客户提供专业的成都网站制作、成都网站设计、外贸营销网站建设、程序、域名、空间一条龙服务,提供基于WEB的系统开发. 服务项目涵盖了网页设计、网站程序开发、WEB系统开发、微信二次开发、成都手机网站制作等网站方面业务。
Class ImgWHInfo '获取图片宽度和高度的类,支持JPG,GIF,PNG,BMP
Dim ASO
Private Sub Class_Initialize
Set ASO=Server.CreateObject("ADODB.Stream")
ASO.Mode=3
ASO.Type=1
ASO.Open
End Sub
Private Sub Class_Terminate
Err.Clear
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,I
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,I
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,I
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 bFlag
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=sConvNum2Str(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 p1191 And p1196 Then Exit Do Else ASO.read(binval2(ASO.Read(2))-2)
Do:p1=binVal(ASO.Read(1)):Loop While p1255 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
Public Function imgW(IMGPath)
Dim FSO,IMGFile,FileExt,Arr
Set FSO = Server.CreateObject("Scripting.FileSystemObject")
If (FSO.FileExists(IMGPath)) Then
Set IMGFile = FSO.GetFile(IMGPath)
FileExt=FSO.GetExtensionName(IMGPath)
Select Case FileExt
Case "gif","bmp","jpg","png":
Arr=GetImageSize(IMGFile.Path)
imgW = Arr(1)
End Select
Set IMGFile=Nothing
Else
imgW = 0
End If
Set FSO=Nothing
End Function
Public Function imgH(IMGPath)
Dim FSO,IMGFile,FileExt,Arr
Set FSO = server.CreateObject("Scripting.FileSystemObject")
If (FSO.FileExists(IMGPath)) Then
Set IMGFile = FSO.GetFile(IMGPath)
FileExt=FSO.GetExtensionName(IMGPath)
Select Case FileExt
Case "gif","bmp","jpg","png":
Arr=getImageSize(IMGFile.Path)
imgH = Arr(2)
End Select
Set IMGFile=Nothing
Else
imgH = 0
End If
Set FSO=Nothing
End Function
End Class
IMGPath="Test.jpg"
Set PP = New ImgWHInfo
W = PP.imgW(Server.Mappath(IMGPath))
H = PP.imgH(Server.Mappath(IMGPath))
Set pp = Nothing
Response.Write("img src='"IMGPath"' border=0br宽:"W";高:"H)
%
#include windows.h
//读bmp图片需要两个结构
#pragma pack(push, enter_defBM, 1) //指定内存对齐单位为1。
typedef struct tagBmpFileHeader
{
WORD bfType; // 文件类型 BM
DWORD bfSize; // 文件大小
WORD bfReserved1; // 保留字
WORD bfReserved2; // 保留字
DWORD bfOffBits; // 位图的数据信息离文件头的偏移量
} BFH;
typedef struct tagBmpImgHeader
{
DWORD biSize; // 表示本结构的大小,0X28
LONG biWidth; // 位图的宽度
LONG biHeight; // 位图的高度
WORD biPlanes; // 位面数永远为1
WORD biBitCount; // 位图的位数
DWORD biCompression; // 压缩类型
DWORD biSizeImage; // 表示位图数据区域的大小
LONG biXPelsPerMeter; // 表示显示设备的水平分辨率
LONG biYPelsPerMeter; // 表示显示设备的垂直分辨率
DWORD biClrUsed; // 实际使用的颜色数目
DWORD biClrImportant; // 重要的颜色数量
} BIH;
#pragma pack(pop, enter_defBM) //恢复默认内存对齐单位。
#define HDIB HANDLE // 位图句柄
DWORD WINAPI DIBNumColors(BYTE * data)
{
WORD wBitCount;
DWORD dwClrUsed = ((BIH *)data)-biClrUsed;
if (dwClrUsed != 0) return (WORD)dwClrUsed;
wBitCount = ((BIH *)data)-biBitCount;
return 1 wBitCount;
}
WORD WINAPI PaletteSize(BYTE * data)
{
return (WORD)(::DIBNumColors(data) * sizeof(RGBQUAD));
}
BYTE * WINAPI FindDIBBits(BYTE * data)
{
return (data + *(DWORD *)data + ::PaletteSize(data));
}
// 获取Bmp的宽度
DWORD FAR DIBWidth(const BYTE * data)
{
BIH * pbmi;
pbmi = (BIH *)data;
if(pbmi-biSize == sizeof(BIH)) return pbmi-biWidth;
else return -1;
}
// 获取Bmp的高度
DWORD FAR DIBHeight(const BYTE * data)
{
BIH * pbmi;
pbmi = (BIH *)data;
if(pbmi-biSize == sizeof(BIH)) return pbmi-biHeight;
else return -1;
}
// 从文件读取Bmp图像数据
HDIB WINAPI ReadDIBFile(FILE * fp)
{
BFH bmf;
HDIB hDIB;
BYTE * pData;
rewind(fp);
if(fread(bmf, sizeof(BFH), 1, fp) != 1) return NULL; // 文件读取错误
if(bmf.bfType != 19778) return NULL; // 文件类型错误
hDIB = (HDIB) ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, bmf.bfSize); // 为DIB分配内存
if (hDIB == 0) return NULL; // 内存分配失败。
pData = (BYTE *)::GlobalLock((HGLOBAL) hDIB); // 锁定
if(fread(pData, 1, bmf.bfSize - sizeof(BFH), fp) != (bmf.bfSize - sizeof(BFH))) // 文件读取错误
{
::GlobalUnlock((HGLOBAL) hDIB); // 解除锁定
::GlobalFree((HGLOBAL) hDIB); // 释放内存
return NULL;
}
::GlobalUnlock((HGLOBAL) hDIB); // 解除锁定
return hDIB; // 返回DIB句柄
}
BOOL WINAPI PaintDIB(HDC hDC, int posX, int posY, HDIB hDIB)
{
BYTE * pDIBHd; // BITMAPINFOHEADER指针
BYTE * pDIBBits; // DIB象素指针
BOOL bSuccess = FALSE; // 成功标志
HPALETTE hPal = NULL; // DIB调色板
//HPALETTE hOldPal = NULL; // 以前的调色板
if (hDIB == NULL) return FALSE; // 判断DIB对象是否为空
pDIBHd = (BYTE *) ::GlobalLock((HGLOBAL) hDIB); // 锁定DIB
pDIBBits = ::FindDIBBits(pDIBHd); // 找到DIB图像象素起始位置
::SetStretchBltMode(hDC, COLORONCOLOR); // 设置显示模式
// 调用SetDIBitsToDevice()来绘制DIB对象
bSuccess = ::SetDIBitsToDevice(hDC, // hDC
posX, posY,
((BIH *)pDIBHd)-biWidth, // nDestWidth
((BIH *)pDIBHd)-biHeight, // nDestHeight
0, // SrcX
0, // SrcY
0, // nStartScan
(WORD)DIBHeight(pDIBHd), // nNumScans
pDIBBits, // lpBits
(LPBITMAPINFO)pDIBHd, // lpBitsInfo
DIB_RGB_COLORS); // wUsage
::GlobalUnlock((HGLOBAL) hDIB); // 解除锁定
return bSuccess;
}
// 打印位图信息
VOID WINAPI PrintDIBInfo(HDIB hDIB)
{
BYTE * pDIBHd = (BYTE *)::GlobalLock((HGLOBAL) hDIB);
BIH * pbmi = (BIH *)pDIBHd;
const char *lp[] =
{
"位图信息长度: %d\n",
"位图图像大小: %dx%d\n",
"位面数:%d\n",
"位图颜色深度: %d\n",
"位图数据压缩类型: %d\n",
"位图数据区域大小: %d\n",
"位图分辨率: 水平 %d dpi, 垂直 %d dpi\n",
};
printf("Windows V3 cBitmapInfoHeader 信息\n\n");
printf(lp[0], pbmi-biSize);
printf(lp[1], pbmi-biWidth, pbmi-biHeight);
printf(lp[2], pbmi-biPlanes);
printf(lp[3], pbmi-biBitCount);
printf(lp[4], pbmi-biCompression);
printf(lp[5], pbmi-biSizeImage);
printf(lp[6], (LONG)(pbmi-biXPelsPerMeter * 0.0254f + 0.5f), (LONG)(pbmi-biYPelsPerMeter * 0.0254f + 0.5f));
::GlobalUnlock((HGLOBAL) hDIB); // 解除锁定
}
int main(int argc, char* argv[])
{
HDIB x;
FILE * fp = fopen("1.bmp", "rb");
if(fp==NULL) return -1;
x = ReadDIBFile(fp);
printf("DIB handle %u", x);
PaintDIB(GetDC(NULL), 0, 0, x);
PrintDIBInfo(x);
return 0;
}
c语言调用图片函数
据我所知Matlab有,imshow(),c好象没有,c只能先将图片读到内存中,经过相关处理后以一定的格式保存到硬盘中,然后再打开图片.
读图和存图需要有专门的函数,这些可以参考:
unsigned char* ReadBMPData(int Width, int Height, char *fname)//图像的宽和高,图像的位置(包括后缀)
{
unsigned char* image = new unsigned char[Width*Height];
FILE *fp;
fp = fopen(fname, "rb");
fread(image, 1, Width*Height, fp);
fclose(fp);
return image;
}
///////////////////////////
void WriteRawData(unsigned char* image, int Width, int Height, char *fname)
{
FILE *fp;
fp = fopen(fname, "wb");
fwrite(image, 1, Width*Height, fp);
fclose(fp);
}