各位大侠高手,图片与C/C++结合的难题
各位大侠
我欲解决用C/C++语言处理一个图片动作的难题,希望大家给点思路。
说起来很简单,做起来没方向。
就是将坐标为(0,100)的图片如何动态移动到(100,100)。需要做的效果和FLASH中类似,也就是说,要出现那种中间过程,不是一下子就到位的,可以花上10秒时间,慢慢移过去那种,拜托了各位!
一定要有中间过程,希望大家都来参与啊!分不够再索取
问题点数:80、回复次数:15Top
1 楼zaisheng09(故雁)回复于 2005-08-01 18:07:35 得分 0
友情upTop
2 楼antijpn(antijpn)回复于 2005-08-01 18:08:49 得分 0
直接求代码,转新手乐园Top
3 楼jixingzhong(瞌睡虫·星辰)回复于 2005-08-01 18:46:08 得分 0
你的问题 可以这样处理
有两个函数
putimage()
和
getimage()
就是用getimage() 得到 (0,100)的图片 ,进行移动
由于你还要看到过程
可以这样,
就是 把 getimage() 得到的图片 不直接 putimage() 到目标坐标
而是以一个象素 为单位 移动
//如果速度还是太快 可以加上一个 delay() 来延长时间显示效果
函数简介如下:
1. getimage() 保存图像函数
功能: 函数getimage()保存左上角与右下角所定义的屏幕上像素图形到指定的内存区域。
用法: 该函数调用方式为void getimage(int left,int top,int right,int bottom,void *buf);
说明: 函数中参数(left,top)为要保存的图像屏幕的左上角,(right,bottom)为其右下角,buf指向保存图像的内存地址。调用getimage()保存屏幕图像,可用imagesize()函数确定保存图像所需字节数,再用malloc()函数分配存储图像的内存(内存分配必须小于64KB),还可以用下面函数putimage()输出getimage()保存的屏幕图像。
这个函数对应的头文件为graphics.h
返回值: 无
例: 把带有两对角线的矩形拷贝到屏幕其它位置上:
#include<garphics.h>
#include<stdlib.h>
#include<conio.h>
void main()
{
int driver,mode;
unsigned size;
void *buf;
driver=DETECT;
mode=0;
initgraph(&driver,&mode,"");
sector(15);
rectangle(20,20,200,200);
setcolor(RED);
line(20,20,200,200);
setcolor(GREEN);
line(20,200,200,20);
getch();
size=imagesize(20,20,200,200);
if(size!=-1){
buf=malloc(size);
if(buf){
getimage(20,20,200,200,buf);
putimage(100,100,buf,COPy_PUT);
putimage(300,50,buf,COPy_PUT);
}
}
outtext("press a key");
getch();
restorecrtmode();
}
2. putimage() 输出图像函数
功能: 函数putimage()将一个先前保存在内存中的图像输出到屏幕上。
用法: 此函数调用方式为void putimage(int left,int top,void *buf,int ops);
说明: 参数(left,top)为输出屏幕图像的左上角,即输出图像的起始位置。buf指向要输出的内存中图像。参数ops控制图像以何种方式输出到屏幕上。表1-13给出了图像输出方式。
表1-13 图像输出方式
--------------------------------------------------------------------
输出方式符号名 取值 含 义
--------------------------------------------------------------------
COPy_PUT 0 图像输出到屏幕上,取代原有图像
xOR_PUT 1 图像和原有像素作异或运算
OR_PUT 2 图像和原有像素作或运算
AND_PUT 3 图像和原有像素作与运算
NOT_PUT 4 把求反的位图像输出到屏幕上
--------------------------------------------------------------------
1) COPy_PUT输出方式
图像中每个像素都直接绘制到屏幕上,取代原有图像像素,包括空白的图像像素(背景)。完全空白的图像可以用来擦除其它图像或屏幕的一部分。但通常选择xOR_PUT输出方式擦除原有图像。
2)xOR_PUT输出方式
原有屏幕每个像素与相应的图像字节作“异或”运算,其结果画到屏幕上。当某一图像和屏幕上原有图像作“异或”运算时,屏幕显示的是两个图像的合成。若相同的图像作异或运算,将有效地擦除该图像,留下原始屏幕。这种输出方式,对动画制作是非常有用的。
3)OR_PUT输出方式
每个图像字节和相应的屏幕像素作“或”运算,再将结果画到屏幕上,这种输出方式也叫“两者取一”。记住,像素中的每位和图像中的每位作“或”运算,这样所得结果是背景和图像的彩色合成图像。
4)AND_PUT输出方式
选择AND_PUT图像输出方式时,屏幕像素和图像字节中都显示的位,运算后仍显示,例如,星图像中的空白背景擦除了方块轮廓以及填充色,只有星图像复盖着的方块留下,即运算后,显示两者相同的图像。
5)NOT_PUT输出方式
NOT_PUT输出方式,除了把图像的每位求反---图像中所有黑的像素(0000)变成了白色(1111),其它方面与COPy_PUT相同。背景图像被重画后将消失。
putimage()函数对应的头文件为garphics.h
返回值: 无
例: 下面的程序说明了imagesize(),getimage()和putimage()函数的调用方法:
#include<graphics.h>
#include<conio.h>
#include<stdlib.h>
void box(int ,int,int,int,int);
void main()
{
int driver,mode;
unsigned size;
void *buf;
driver=DETECT;
mode=0;
initgraph(&driver,&mode,"");
box(20,20,200,200,15);
setcolor(RED);
line(20,20,200,200);
setcolor(GREEN);
line(20,200,200,20);
getch();
size=imagesize(20,20,200,200);
if(size!=-1)
{
buf=malloc(size);
if(buf){
getimage(20,20,200,200,buf);
putimage(120,120,buf,COPy_PUT);
putimage(280,60,buf,COPy_PUT);
}
}
outtext("Press a key");
getch();
restorecrtmode)(;
}
void box(int startx,int starty,int endx,int endy,int color)
{
setcolor(color);
rectangle(startx,starty,endx,endy);
}
图像函数是对屏幕图像操作进行讨论的,但对屏幕图形同样适用。实际上,屏幕图形也是一种特定的屏幕图像,它可称为外形屏幕图像或称轮廓屏幕图像。因此图像与图形不必区分。Top
4 楼jixingzhong(瞌睡虫·星辰)回复于 2005-08-01 18:49:50 得分 0
忘记说了一点
就是 在getimage() 保存图像函数 之后
不要忘记 把 getimage() 的区域覆盖掉 ,
就是要给人的感觉是 图形移动 ,那么在新图形出现以前
原有的 图形必须被抹去 (贴上空白图形就可以了)
在后面的循环中
每一步都要进行同样的过程 ...Top
5 楼jixingzhong(瞌睡虫·星辰)回复于 2005-08-01 18:52:28 得分 0
楼主如果对于这个还有问题
需要探讨
请发消息给我 (论坛有消息发送功能,点几我的 ID 就可以了)
大家可以互相研究一下 ...Top
6 楼sunsonh()回复于 2005-08-02 09:10:57 得分 0
非常感谢您的支持和帮助!我先研究一下啊Top
7 楼sunsonh()回复于 2005-08-02 10:20:29 得分 0
着急了!问了几个前辈说,嵌入式的可能和这个不一样。我正在做一个机顶盒的界面,还不一定能用这个来实现。而且,我用VC++6.0
怎么说:
#include<graphics.h>
没有啊Top
8 楼conglingkaishi(请不要给我分)回复于 2005-08-02 10:28:45 得分 0
不能用的话就直接调用INT10H,然后用直接写屏。Top
9 楼TomaTooooo(醋熘白菜)回复于 2005-08-02 17:03:18 得分 0
flash 里的我倒是会,C++我就不会了,哈哈Top
10 楼jixingzhong(瞌睡虫·星辰)回复于 2005-08-03 10:29:38 得分 0
呵呵 楼主的情况很复杂呀
呵呵
友情 UP !Top
11 楼sunsonh()回复于 2005-08-03 13:30:03 得分 0
救命啊Top
12 楼atgjplh(永远的C/C++(unix/liunx))回复于 2005-08-03 14:28:17 得分 0
学习一下Top
13 楼lxqing1981(新)回复于 2005-08-03 20:12:44 得分 0
upTop
14 楼sunsonh()回复于 2005-08-04 18:04:25 得分 0
UP P PTop
15 楼mayflowers(黯然神伤)回复于 2005-08-04 20:56:54 得分 0
要看你的image是在系统提供的控件(比如dialog)上画,还是直接在屏幕上画。如果是前者,还要看你是在控件里添加图形还是用图形覆盖控件的显示等等等等。
至于具体的头文件和函数,要看你所用的嵌入系统的sdk支持什么样的图形库,由它决定。
什么都不知道的情况下,大家很难说啊,呵呵。Top




