易码技术论坛

 找回密码
 加入易码
搜索
查看: 234680|回复: 16

[源码] 直接绘制2色Bmp图像的Lava程序

[复制链接]
发表于 2004-12-10 18:07:00 | 显示全部楼层
粘贴过来之后,代码开头的缩进都没有了-_-b
大家凑合着看吧。
发表于 2004-12-10 21:41:00 | 显示全部楼层
呵呵,看完了,老F是不是开始推荐大家在WQX上多用BMP呀?
发表于 2004-12-10 21:48:00 | 显示全部楼层
lava2,支持16灰度的bmp。
当然也支持黑白bmp。
 楼主| 发表于 2004-12-10 22:41:00 | 显示全部楼层
……GBA支持真彩画面……嘿嘿。
主要是Bmp用起来方便一点,这个显示的不快的应该,因为还得算啊算啊。
发表于 2004-12-10 22:55:00 | 显示全部楼层
GBA只有32768色,笔记本支持16M色。
攀比没必要的。
16灰度的机器已经够用了。
 楼主| 发表于 2004-12-10 23:02:00 | 显示全部楼层
想当年GB是4色就打天下了。关键还是软件要充足啊~~
发表于 2004-12-10 23:07:00 | 显示全部楼层
lava2就是lava2机器软件的保障啊。
继承了lava1的软件,又有一批高质量的lava2软件。
发表于 2004-12-10 23:12:00 | 显示全部楼层
不过,尽管软件重要。但是黑白机器做游戏的确表现力很弱。4色虽少,但也很有表现力了。
黑白做不出来windows风格的窗口的凸凹感,4色则可以。
 楼主| 发表于 2004-12-10 23:18:00 | 显示全部楼层
翻了一倍~
想想大千世界的表现力是哪里来的?色彩和造型啊~~^_^
要是什么时候屏幕发色数和人眼可视范围一样了,就无敌了。
发表于 2004-12-10 23:36:00 | 显示全部楼层
个人认为目前16灰度是潮流。
彩色屏幕虽然好,但是成本太高,作为电子词典太奢侈了。
不要说gba多么便宜,gba的发售量巨大,屏幕成本就能降下来,而且任天堂主要靠卖软件赚钱而不是靠卖硬件赚钱。在中国,由于盗版严重,卖电子词典就甭指望软件赚钱了,但厂商也要有利润啊,所以机器就便宜不了。所以最近两年彩屏词典还不会低于2000元。
发表于 2004-12-10 23:38:00 | 显示全部楼层
当然,如果有比较合适的彩屏词典,lava也会及时跟进,增加彩色绘图函数的。
发表于 2004-12-11 12:22:00 | 显示全部楼层
你的算法不好...
Lava有一个Draw函数...

原型: void Xdraw(int mode); 功能: 全屏特效       mode=4:缓冲区的图形左右反转。
      mode=5:缓冲区的图形上下反转
用XDraw(5)就能实现图形上下翻转了...比用for(;;)快多多了...
N年前 诗诺比制作过一个 bmp浏览器..在wqxsky论坛...
 楼主| 发表于 2004-12-11 12:31:00 | 显示全部楼层
请仔细看好再发表评论……不是上下反转的……还要做Xor运算。
总之,这个也不全的,需要根据颜色表来具体对待。
这个主要是研究bmp格式的时候随手写的,并没有准备把它发展成什么浏览器的计划。
随便试试就算了……另外,诗诺比的东西有源码么?我没有见过所以不清楚。

14852_5283_6132.rar

2 KB, 下载次数: 256

发表于 2004-12-11 12:36:00 | 显示全部楼层
其实诗诺比那个也是写着玩儿的...只支持160*80单色的bmp图片.....
...至于要不要反色...我也不是很清楚...反正我以前看到诗诺比的代码上有格XDraw(5)..其他不记得了..
发表于 2004-12-11 12:42:00 | 显示全部楼层
好啊,有源代码[em02]
支持楼主!
------------------------------
楼上的,楼主写的可是可以支持任意大小的单色图哦~
对吧?

3796_5289_1564.rar

26 KB, 下载次数: 256

14854_5289_6134.rar

1 KB, 下载次数: 184

 楼主| 发表于 2004-12-11 12:48:00 | 显示全部楼层
我并不是说因为这段代码是写着玩的,所以就如何如何……因此其他人是不是写着玩……和代码没有关系吧?^_^
大家都喜欢写着玩~
昨天写出来之后,在汇编版里面某帖子后面和lee讨论了半天,弄明白颜色表的问题了。
但是函数没有改,只支持那种需要Xor的Bmp图片,大概画板还有Acesee转换出来的黑白2色是这样的。另外,这个函数并不仅仅局限160*80的Bmp图像,是支持任意大小的。
如果谁愿意加一些判断,考察一下颜色表,那么当然更好,不用Xor反而要快很多。
 楼主| 发表于 2004-12-10 18:05:11 | 显示全部楼层 |阅读模式
可以不加转换直接把Bmp文件绘制到WQX屏幕上面。
没有多测试过,也不知道在实机上效率如何。
  1. //typedef struct tagBITMAPFILEHEADER()
  2. #define bfType        0    //WORD  位图文件的类型,必须为BM
  3. #define bfSize        2    //DWORD 位图文件的大小,以字节为单位
  4. #define WORDbfReserved1  6    //Byte  位图文件保留字,必须为0
  5. #define WORDbfReserved2  7    //Byte  位图文件保留字,必须为0
  6. #define bfOffBits      8    //DWORD 位图数据的起始位置,以相对于位图
  7. //typedef struct tagBITMAPINFOHEADER
  8. #define biSize        0    //DWORD 本结构所占用字节数
  9. #define biWidth        4    //LONG  位图的宽度,以像素为单位
  10. #define biHeight       8    //LONG  位图的高度,以像素为单位
  11. #define biPlanes       12    //WORD  目标设备的级别,必须为1
  12. #define biBitCount      14    //WORD  每个像素所需的位数,必须是1(双色),
  13.                       //    4(16色),8(256色)或24(真彩色)之一
  14. #define biCompression    16    //DWORD 位图压缩类型,必须是 0(不压缩),
  15.                       //    1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一
  16. #define biSizeImage     20    //DWORD 位图的大小,以字节为单位
  17. #define biXPelsPerMeter  24    //LONG  位图水平分辨率,每米像素数
  18. #define biYPelsPerMeter  28    //LONG  位图垂直分辨率,每米像素数
  19. #define biClrUsed      32    //DWORD 位图实际使用的颜色表中的颜色数
  20. #define biClrImportant   36    //DWORD 位图显示过程中重要的颜色数
  21. char ShowBmp(int bmpdat,int x,int y,int type)
  22. {
  23. char bMap[12];
  24. char bInfo[40];
  25. char buf[1600];
  26. long i,j;
  27. int  w,h,dw,dl;
  28. //检查是否为Bmp文件
  29. memcpy(bMap,bmpdat,12);
  30. if(bMap[bfType]!=0x42||bMap[bfType+1]!=0x4d) return 0;
  31. //检查是不是Bit1的Bmp文件
  32. memcpy(bInfo,bmpdat+12,40);
  33. if(bInfo[biBitCount]!=1) return 0;
  34. memcpy(&w,bInfo+biWidth+2,2);
  35. memcpy(&h,bInfo+biHeight+2,2);
  36. //检查是不是超限
  37. if(w>160 || h>80 ) return 0;
  38. //计算需要拷贝的数据量和间隔长度
  39. dw=w/8;
  40. if(dw*8!=w) dw++;
  41. dl=dw/4;
  42. if(dl*4!=dw) dl=(dl+1)*4; else dl=dl*4;
  43. //将原数据转换成WriteBlock的可读取数据
  44. for(i=0;i<h;i++)
  45. {
  46.   memcpy(buf+i*dw,bmpdat+62+dl*(h-1-i),dl);
  47.   for(j=0;j<dw;j++) buf[i*dw+j]=buf[i*dw+j] ^ 0xff;
  48. }
  49. WriteBlock(x,y,w,h,type,buf);
  50. return 1;
  51. }
  52. //例子
  53. void main()
  54. {
  55. char fp;
  56. char bmpdat[1662];
  57. fp=fopen("/LavaData/Scr.bmp","rb");
  58. fread(bmpdat,1,1662,fp);
  59. ShowBmp(bmpdat,0,0,1);
  60. Refresh();
  61. getchar();
  62. }
复制代码
您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

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

GMT+8, 2024-3-29 19:04 , Processed in 0.012654 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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