📄 op-2.c
字号:
#include <windows.h>
#include <stdio.h>
#include <limits.h>
#define NNN 8
#define Nketa 3
/* 存放图像信息的结构 */
struct PictureInfo
{
long left,top;
long width;
long height;
WORD x_density;
WORD y_density;
short colorDepth;
HLOCAL hInfo;
};
/* 存放RGB值的资料结构 */
typedef struct RGB_COL{ int r,g,b;}RGBcolor;
char mbuf[256];
int readmode;
/* 传回plug-in的信息 */
int WINAPI GetPluginInfo(int infono,LPSTR buf,int buflen)
{
switch (infono)
{
case 0:
strncpy(buf,"00IN",buflen);
break;
case 1:
strncpy(buf,"HD2 to DIB filter ver.0.08b",buflen);
break;
case 2:
strncpy(buf,"*.HD2",buflen);
break;
case 3:
strncpy(buf,"HD2 decoding sample",buflen);
break;
default:
return(0);
}
return(strlen(buf));
}
/* 判断资料是否对应plug-in */
int WINAPI IsSupported(LPSTR filename,DWORD dw)
{
unsigned char buffer[2048];
unsigned char *p;
if (dw & 0xffff0000)
p = (unsigned char*)dw;
else
{
DWORD r;
p = buffer;
if (!ReadFile((HANDLE)dw,(void*)p,4,&r,NULL))
return(0);
}
buffer[4]='\0';
if (strcmp(buffer,"HDT2")==0)
return(1);
return(0);
}
/* 关闭文件 */
int MYlclose(HFILE fp)
{
if (!readmode)
_lclose(fp);
return(0);
}
/* 设置预设值 */
int set_defaultBMI(BITMAPINFOHEADER *bmi)
{
bmi->biSize=sizeof(BITMAPINFOHEADER);
bmi->biPlanes=1;
bmi->biCompression=BI_RGB;
bmi->biSizeImage=0;
bmi->biXPelsPerMeter=0;
bmi->biYPelsPerMeter=0;
bmi->biClrUsed=0;
bmi->biClrImportant=0;
return(0);
}
/* 将4字节的数值资料从文件读入 */
int getLong(HFILE fp)
{
char buf[10];
readData(buf,4,fp);
return((buf[0]<<24) |(buf[1]<<16) | (buf[2]<<8) | buf[3]);
}
/* 从文件读入2字节的数值资料*/
int getShort(HFILE fp)
{
char buf[10];
readData(buf,2,fp);
return((buf[0]<<8) | buf[1]);
}
/* 读入1字节的数值资料 */
unsigned int getC(HFILE fp)
{
char buf[4];
readData(buf,1,fp);
return((unsigned int)buf[0]);
}
/* 从文件读入数字节 */
int readData(char *data,int len,HFILE fp)
{
return(_lread(fp,data,len));
}
static int bits=0;
static int bdata=0;
/* 输入处理的初始化 */
int fgetBitInit()
{
bits=0;
bdata=0;
return(0);
}
/* 输入1字节 */
int fgetBit(HFILE fp)
{
unsigned char bbuf;
int val;
if (bits==0)
{
readData(&bbuf,1,fp);
bdata=bbuf;
}
val=(bdata>>7)&1;
bdata=(bdata<<1) & 0xff;
bits++;
if (bits>=8)
{
bits=0;
bdata=0;
}
return(val);
}
/* 输入n字节 */
int fgetNumber(int bits,HFILE fp)
{
int i,res,sn;
sn=fgetBit(fp);
if (sn==0)
sn=1;
else
sn=-1;
res=0;
for (i=0;i<bits;i++)
{
res=res*2;
res+=fgetBit(fp);
}
return(res*sn);
}
/* 以任意字节数来输出(含正负) */
int fgetCompNumber(int bits,HFILE fp)
{
int i,res,sn;
bits--;
sn=fgetBit(fp);
if (sn==0)
sn=1;
else
sn=-1;
res=0;
for (i=0;i<bits;i++)
{
res=res*2;
res+=fgetBit(fp);
}
for (i=0;i<15-bits;i++)
res=res*2;
return(res*sn);
}
/* 读入标头 */
int getImgInfo(int *mx,int *my,int *dep,HFILE fp)
{
char buf[100];
readData(buf,4,fp);
*mx=getLong(fp);
*my=getLong(fp);
*dep=24;
return(0);
}
/* 将画素值设置到24位DIB上 */
int setColor(int x,int y,unsigned char *data,int mx,int my,RGBcolor *col)
{
int adr,mmx;
if (x>=mx)
return;
if (y>=my)
return;
mmx=(mx*3)/4*4;
adr=x*3+(my-y-1)*mmx;
data[adr+2]=col->r;
data[adr+1]=col->g;
data[adr ]=col->b;
return(0);
}
short adm[NNN][NNN][NNN][NNN];
/* 解压缩处理主程序 */
long decode(HFILE fp,unsigned char *img,int mx,int my)
{
int x,y,u,v;
int lx,ly,loopx,loopy;
int r_re[NNN*NNN];
int sum;
RGBcolor col;
int code_bits[8*8]=
{
16,14,12,10,8,6,4,4,
14,12,10,8,6,4,4,4,
12,10,8,6,4,4,4,4,
10,8,6,4,4,4,4,4,
8,6,4,4,4,4,4,4,
6,4,4,4,4,4,4,4,
4,4,4,4,4,4,4,4,
4,4,4,4,4,4,4,4
};
/* 制作哈达玛阵列 */
for (v=0;v<NNN;v++)
for (u=0;u<NNN;u++)
for (y=0;y<NNN;y++)
for (x=0;x<NNN;x++)
adm[u][v][x][y]=get_matrix(u,v,x,y);
loopx=(mx+NNN-1)/NNN;
loopy=(my+NNN-1)/NNN;
fgetBitInit();
for (ly=0;ly<loopy;ly++)
for (lx=0;lx<loopx;lx++)
{
for (y=0;y<NNN;y++)
for (x=0;x<NNN;x++)
r_re[x+y*NNN]=fgetCompNumber(code_bits[y*8+x],fp);
for (v=0;v<NNN;v++)
for (u=0;u<NNN;u++)
{
sum=0;
for (y=0;y<NNN;y++)
for (x=0;x<NNN;x++)
{
if (adm[u][v][x][y]>0)
sum+=(r_re[x+y*NNN]);
else
sum-=(r_re[x+y*NNN]);
}
sum/=(NNN*NNN);
col.r=sum;
col.g=sum;
col.b=sum;
setColor(lx*NNN+u,ly*NNN+v,img,mx,my,&col);
}
}
return(0);
}
/* 读入图像资料 */
int WINAPI GetPicture(LPSTR file_name,long len,unsigned int flag,
HANDLE *pHBInfo,HANDLE *pHBm,
FARPROC lpPrgressCallback,long lData)
{
unsigned int sig_read = 0;
int i;
int mx,my,mmx,dep;
int mode;
HFILE fp;
BITMAPINFOHEADER *bmi;
BITMAPINFO *bm;
RGBQUAD ipal[256];
byte *image;
mode = flag & 7;
*pHBInfo=NULL;
*pHBm=NULL;
if (mode == 0)
readmode=0; /* 从文件读入 */
else
if (mode == 1)
{
readmode=1; /* 从存贮器读入 */
return(-1); /* 表不支持 */
}
else
return(-1);
if (readmode==0)
if ((fp = _lopen(file_name,OF_READ))==HFILE_ERROR)
return(6);
/* 读出图像大小信息 */
getImgInfo(&mx,&my,&dep,fp);
/* 制作图像资料区域 */
mmx=(mx*3+3)/4*4;
*pHBInfo=GlobalAlloc(GHND,sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD));bmi=
GlobalLock(*pHBInfo);
set_defaultBMI(bmi);
bmi->biWidth=mx;
bmi->biHeight=my;
bmi->biBitCount=dep;
*pHBm=GlobalAlloc(GHND,(mmx) * (my+1));
if (*pHBm==NULL)
return(4);
bm=(BITMAPINFO*)bmi;
for (i=0;i<256;i++)
bm->bmiColors[i]=ipal[i];
image=GlobalLock(*pHBm);
if (!image)
return(5);
decode(fp,image,mx,my);
MYlclose(fp);
GlobalUnlock(*pHBInfo);
GlobalUnlock(*pHBm);
return(0);
}
/* 读入预览图像 */
int WINAPI GetPreview(LPSTR buf,long len,unsigned int flag,
HANDLE *pHBInfo,HANDLE *pHBm,
FARPROC lpPrgressCallback,long lData)
{
return(-1);
}
/* 取得图像信息 */
int WINAPI GetPictureInfo(LPSTR buf,long len,unsigned int flag,struct PictureInfo *lpInfo)
{
HFILE fp;
int mode;
int wt,ht,dep;
mode = flag & 7;
if (mode == 0)
{
}
else
if (mode == 1)
return(-1);
else
return(-1);
if ((fp=_lopen(buf,OF_READ))==HFILE_ERROR)
return(8);
_llseek(fp,len,0);
getImgInfo(&wt,&ht,&dep,fp);
dep=24;
lpInfo->left=0;
lpInfo->top=0;
lpInfo->width=wt;
lpInfo->height=ht;
lpInfo->x_density=0;
lpInfo->y_density=0;
lpInfo->colorDepth=dep;
lpInfo->hInfo = NULL;
_lclose(fp);
return(0);
}
/* 求出哈达玛阵列 */
int get_matrix(int u,int v,int x,int y)
{
return((func_q(x,y,u,v)%2==0) ? 1 : -1);
}
/* 求出Fig.4-29的q */
int func_q(int x,int y,int u,int v)
{
int i;
int sum;
sum=0;
for (i=0;i<NNN;i++)
sum+=(getNbit(x,i)*ggg(u,i)+getNbit(y,i)*ggg(v,i));
return(sum);
}
/* 求出Fig.4-29的g */
int ggg(int u,int i)
{
return(getNbit(u,Nketa-i) + getNbit(u,Nketa-i-1));
}
/* 求出x的第n位 */
int getNbit(int x,int n)
{
x>>=n;
return(x&1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -