易码技术论坛

 找回密码
 加入易码
搜索
查看: 163216|回复: 5

[感悟]Lava的图案操作

[复制链接]
发表于 2005-5-1 12:25:00 | 显示全部楼层
以下是引用诸葛亮的很在2005-4-30 22:29:24的发言:


所以当制作16像素宽的图像时,请先从第9个像素开始查点,查到16以后再拐回来查1到8。然后将此2进制数据转化为16进制或者10进制。

晕,int类型是高位在后,低位在前的,当然会这样了
要存图的话,存在char数组里就行了,省得麻烦
 楼主| 发表于 2005-5-1 12:58:00 | 显示全部楼层
高位在后低位在前。。。。
我仔细看看书
发表于 2005-5-1 16:43:00 | 显示全部楼层
是低位在前的,绝对没错。汇编的基础的基础……
发表于 2005-5-1 17:20:00 | 显示全部楼层
……楼主精神可嘉。
发表于 2005-5-13 16:06:00 | 显示全部楼层
好像和bmp的存在方法类似,只不过是反的,我也曾经研究过。
 楼主| 发表于 2005-4-30 22:29:24 | 显示全部楼层 |阅读模式
仔细钻研了几天,终于搞清楚了lava1中关于WriteBlock()的位图操作问题。
格式为:
WriteBlock(图案左上角x坐标,图案左上角y坐标,图像宽度,图像高度,显示模式,图像地址);

前2个参数不用说了

图像宽度后面有专门讲解
图像高度当然是像素级别的。
显示模式:填写1,正常显示;填写2,反白显示;填写0x21或者33左右翻转(必须图像宽度设置为8的倍数)

图像地址可以是指定的数组位置。

上面的帮助文件里面都有说明,下面才是我自己思考的内容。

我第一次使用这个函数的时候,我在坐标纸上画了一个20x20像素的图案,然后从坐到右每一行依次查点,一行记录一下,换算成16进制,储存成了以下形式:
int pic[]={0x1234f,0x234d12,0x4c7656......(省略若干)};

然后用WriteBlock(1,1,20,20,1,pic);输出

发现输出的图像都是乱七八糟的图案,根本不成形状。

我就慢慢的减少图像宽度这个参数,当图像宽度调整成为16的时候,即WriteBlock(1,1,16,20,1,pic);的时候,屏幕上出现了图案,但是只有我想要的图案的一部分,也就是左半边16个像素。

后来我观察博士失踪记的图像源码,发现里面一个16个像素宽的图像的16进制数据转化为2进制以后,表现出来的图像是原始图像的左右部分的平移。

即:假设这样的一行16个像素数据10001111 00110101
经过WriteBlock函数输出的时候
实际输出效果是00110101 10001111
正好左右平移

所以当制作16像素宽的图像时,请先从第9个像素开始查点,查到16以后再拐回来查1到8。然后将此2进制数据转化为16进制或者10进制。

我还发现其图像宽度受到图形数据的类型的影响
即:char型的位图数据和int型的位图数据,可以使用的图像宽度不同。

char型也就是0~255的范围,能表示8个像素宽度
int型可以表示16个像素宽度

当我们用char型数据的时候
我们可以调整的图像宽度为0~8,如果大于8,将会出现怪异图像
当我们用int型数据的时候
我们可以调整的图像宽度为9~16,超过这个范围,将混乱显示。

由此我总结出了以下几点经验
绘制8个像素以上的图片的时候,尽量使用int类型
绘制8个像素以下的图片的时候,只能使用char型[em15]
读点的时候,从右半边开始读,读完了再拐回左半边读

制作小像素规模的(比如4x4/3x3像素的),可以使用char型,不过要紧贴着左边绘图,然后图像宽度参数调成自己需要的,这个函数的特点是左上角不动,右下角依照参数而动。而数据的写屏,也是从左上角开始的。

有错误之处请指教,谢谢
您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2025-6-17 02:40 , Processed in 0.012832 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表