我想在实时监控的程序中加一些我自己的程序(像素数据的显示)可是画面总是在动,如何一帧一帧的??我的程序如下#define ESC 27void enlarge(int Xs,int Ys,int Dx,int Dy,int Xd,int Yd,int f)
{ // 256 色图像放大整数倍
int i,j,k,xx,yy; // f 为放大倍数, 应为整数, 采用重复法。
BYTE buffer[1024]; xx=(swide-Xd)/f;
yy=(sdeep-Yd)/f;
Dx=min(Dx,xx); Dy=min(Dy,yy);
for (i=0;i<Dy;i++) {
get_image(Xs,Ys+i,Dx,1,buffer);
for (j=Dx-1;j>-1;j--) {
for (k=0;k<f;k++)
buffer[j*f+k]=buffer[j];
}
for (j=0;j<f;j++)
put_image(Xd,Yd+i*f+j,Dx*f,1,buffer);
}
}void show(char *file,int Dx, int Dy, int dx, int dy, int color) // 显示窗口数据和调色板
{
int i, j, x, y, xold, yold, ch, n=0;
int f,xnew,ynew;
BYTE buff[150], buffer[800]; Dx=min(Width, Dx); Dy=min(Height, Dy); // 确定实际显示尺寸
xold=x=Dx/2; yold=y=Dy/2; // 显示数据位置初始化
palette(120,420,10,10,0); // 用块充填子程序画256个彩色方块
box(118, 418, 163, 163, 1, color); // 画调色板外框
box(595, 29, 5*dx+2, 5*dy+2, 1, color); // 画放大区域外框
set_color(color); // 设前景色
Str16(file, 420, 490);
Str16("用光标键或鼠标选择显示窗口。", 420, 520); // 显示提示语
Str16("按 <ESC> 键,或光标点图外退出。", 420, 550);
ch=0x40;
do {
if ((x != xold)||(y != yold)||(n==0)) { // 检查坐标是否改变
if (n==1) // 背景保存否?
put_image(xold-1, yold-1, dx+2, dy+2, buffer); // 恢复边界图像,步骤(2)
get_image(x-1, y-1, dx+2, dy+2, buffer); // 保存边界及内部数据,步骤(3)
n=1; // 设置背景保存标志
box(x-1, y-1, dx+2, dy+2, 1, color); // 显示小方框,步骤(4)
xold=x; yold=y; // 保存光标当前位置
enlarge(x, y, dx, dy, 596, 30, 5); // 小方框中图像放大5倍显示
get_image(x, y, dx, dy, buff); // 取出小方框中数据
for (j=0; j<dy; j++) {
for (i=0; i<dx; i++)
Num16(buff[dx*j+i], 480+40*i, 140+20*j, 1); // 显示小框内的像素数据
}
}
f = KeyCoor(&xnew, &ynew); // 读键盘、鼠标状态及位置,动态显示步骤(1)
if (f==1) { // 鼠标左键按下
x=xnew-dx/2; y=ynew-dy/2; // 按中心点位置计算窗口左上角坐标
}
else if (f==16) { // 有字符输入
ch=getch(); // 输入字符
if (ch) continue; // 非功能键输入,不处理进入下一循环
ch=getch(); // 输入功能键第二字节
switch(ch) {
case 0x48 : // 方框上移处理
y-=(dy/2); break; // 坐标上移半步长
case 0x50 : // 方框下移处理
y+=(dy/2); break; // 坐标下移半步长
case 0x4b : // 方框左移处理
x-=(dx/2); break; // 坐标左移半步长
case 0x4d : // 方框右移处理
x+=(dx/2); break; // 坐标右移半步长
default : break; // 其他功能键输入不处理
}
}
if ((y<1)||(y>=Dy-dy)||(x<1)||(x>=Dx-dx)) break; // 光标出界,退出循环
}
while(ch != ESC); // 不按 ESC 键,继续
}void T43(void)
{
int i, color;
char file[40];
char filea[][10]={"luyu8g","test8c","test_4","lu_msk1"}; // 图像文件名 SetTitle("T43: 256色及以下模式图像像素数据的显示"); VesaOn(0x103); // 设置图像显示模式,256色分辨率800*600
set_bkcolor(0); // 设置背景色
for (i=0; i<4; i++) {
fillw(0,0,swide,sdeep,0); // 用 0号色清屏
strcpy(file,filepath); // 复制路径
strcat(file,filea[i]); // 加上文件名
strcat(file,".bmp"); // 加上文件后缀成文件全称
loadBMPimage(file,0,0,400,400,0,0); // 显示图像
if (BitCount==1) color=8; // 设置前景色,二值图像
else if (BitCount==4) color=15; // 16色图像
else color=220; // 256色图像
BitCount=8; // 对于二值和16色图像文件,修改模式类型使之也能显示
show(file,400,400,8,16,color); // 显示窗口数据和调色板
}
}请各位高手看一下.
{ // 256 色图像放大整数倍
int i,j,k,xx,yy; // f 为放大倍数, 应为整数, 采用重复法。
BYTE buffer[1024]; xx=(swide-Xd)/f;
yy=(sdeep-Yd)/f;
Dx=min(Dx,xx); Dy=min(Dy,yy);
for (i=0;i<Dy;i++) {
get_image(Xs,Ys+i,Dx,1,buffer);
for (j=Dx-1;j>-1;j--) {
for (k=0;k<f;k++)
buffer[j*f+k]=buffer[j];
}
for (j=0;j<f;j++)
put_image(Xd,Yd+i*f+j,Dx*f,1,buffer);
}
}void show(char *file,int Dx, int Dy, int dx, int dy, int color) // 显示窗口数据和调色板
{
int i, j, x, y, xold, yold, ch, n=0;
int f,xnew,ynew;
BYTE buff[150], buffer[800]; Dx=min(Width, Dx); Dy=min(Height, Dy); // 确定实际显示尺寸
xold=x=Dx/2; yold=y=Dy/2; // 显示数据位置初始化
palette(120,420,10,10,0); // 用块充填子程序画256个彩色方块
box(118, 418, 163, 163, 1, color); // 画调色板外框
box(595, 29, 5*dx+2, 5*dy+2, 1, color); // 画放大区域外框
set_color(color); // 设前景色
Str16(file, 420, 490);
Str16("用光标键或鼠标选择显示窗口。", 420, 520); // 显示提示语
Str16("按 <ESC> 键,或光标点图外退出。", 420, 550);
ch=0x40;
do {
if ((x != xold)||(y != yold)||(n==0)) { // 检查坐标是否改变
if (n==1) // 背景保存否?
put_image(xold-1, yold-1, dx+2, dy+2, buffer); // 恢复边界图像,步骤(2)
get_image(x-1, y-1, dx+2, dy+2, buffer); // 保存边界及内部数据,步骤(3)
n=1; // 设置背景保存标志
box(x-1, y-1, dx+2, dy+2, 1, color); // 显示小方框,步骤(4)
xold=x; yold=y; // 保存光标当前位置
enlarge(x, y, dx, dy, 596, 30, 5); // 小方框中图像放大5倍显示
get_image(x, y, dx, dy, buff); // 取出小方框中数据
for (j=0; j<dy; j++) {
for (i=0; i<dx; i++)
Num16(buff[dx*j+i], 480+40*i, 140+20*j, 1); // 显示小框内的像素数据
}
}
f = KeyCoor(&xnew, &ynew); // 读键盘、鼠标状态及位置,动态显示步骤(1)
if (f==1) { // 鼠标左键按下
x=xnew-dx/2; y=ynew-dy/2; // 按中心点位置计算窗口左上角坐标
}
else if (f==16) { // 有字符输入
ch=getch(); // 输入字符
if (ch) continue; // 非功能键输入,不处理进入下一循环
ch=getch(); // 输入功能键第二字节
switch(ch) {
case 0x48 : // 方框上移处理
y-=(dy/2); break; // 坐标上移半步长
case 0x50 : // 方框下移处理
y+=(dy/2); break; // 坐标下移半步长
case 0x4b : // 方框左移处理
x-=(dx/2); break; // 坐标左移半步长
case 0x4d : // 方框右移处理
x+=(dx/2); break; // 坐标右移半步长
default : break; // 其他功能键输入不处理
}
}
if ((y<1)||(y>=Dy-dy)||(x<1)||(x>=Dx-dx)) break; // 光标出界,退出循环
}
while(ch != ESC); // 不按 ESC 键,继续
}void T43(void)
{
int i, color;
char file[40];
char filea[][10]={"luyu8g","test8c","test_4","lu_msk1"}; // 图像文件名 SetTitle("T43: 256色及以下模式图像像素数据的显示"); VesaOn(0x103); // 设置图像显示模式,256色分辨率800*600
set_bkcolor(0); // 设置背景色
for (i=0; i<4; i++) {
fillw(0,0,swide,sdeep,0); // 用 0号色清屏
strcpy(file,filepath); // 复制路径
strcat(file,filea[i]); // 加上文件名
strcat(file,".bmp"); // 加上文件后缀成文件全称
loadBMPimage(file,0,0,400,400,0,0); // 显示图像
if (BitCount==1) color=8; // 设置前景色,二值图像
else if (BitCount==4) color=15; // 16色图像
else color=220; // 256色图像
BitCount=8; // 对于二值和16色图像文件,修改模式类型使之也能显示
show(file,400,400,8,16,color); // 显示窗口数据和调色板
}
}请各位高手看一下.
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货