- 注册时间
- 2005-4-30
- 最后登录
- 1970-1-1
|
仔细钻研了几天,终于搞清楚了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型,不过要紧贴着左边绘图,然后图像宽度参数调成自己需要的,这个函数的特点是左上角不动,右下角依照参数而动。而数据的写屏,也是从左上角开始的。
有错误之处请指教,谢谢
|
|