易码技术论坛

 找回密码
 加入易码
搜索
查看: 742277|回复: 14

[归档] 【LAVA的求助】如何从文件读图,并且显示?谢谢了~

[复制链接]
发表于 2006-8-25 09:22:54 | 显示全部楼层
不太会编辑帖子~弄得里面有乱码,又误操作成斜体,不会改回来。~
影响了各位高手阅读,不好意思了~
发表于 2006-8-25 09:25:41 | 显示全部楼层
DAT和BMP是以8位为基准 反向的,转一下吧,用我的KEC
 楼主| 发表于 2006-8-25 09:27:31 | 显示全部楼层
虾米?什么8位基准?什么转一下?什么KEC?
不好意思,我小菜鸟一个,回答能否尽量通俗一点点~~
不过还是谢谢楼上的~
发表于 2006-8-25 10:19:05 | 显示全部楼层
帮你编辑了帖子。
BMP文件包含文件头,直接读就会出错。

而且BMP文件储存的图象数据顺序是由下到上,所以读出来是反的。
并且还有对齐问题,不能直接读的。
发表于 2006-8-25 10:59:52 | 显示全部楼层
有专门的软件把图片转成数据的时候是去头的。
 楼主| 发表于 2006-8-25 11:34:14 | 显示全部楼层
谢谢FantasyDR大侠帮忙编辑帖子~
也谢谢杜若版主~~
但是我还是不懂怎么读入啊?
有什么专门的软件转换的?
发表于 2006-8-25 12:15:04 | 显示全部楼层
用SEESTAR转成 2进制的 DAT(该文件大小1600B)
然后就可以读了,读后直接用WriteBlock
发表于 2006-8-25 12:41:24 | 显示全部楼层
摘自MSDN:
Each scan line in the rectangle must be word aligned (scan lines that are not word aligned must be padded with zeros).
简单的说,BMP的每一行必须都是2*N个字节,而LavaX的WriteBlock函数所需要的数据每一行可以是N个字节。
BMP保存图像的时候是从最后一行开始的,而LavaX的WriteBlock函数所需要的数据是从第一行开始的。
另外,BMP格式里面的图像数据0、1不一定就代表白色、黑色,这个还和BMP的调色板有关系。
所以如果想直接读取BMP要很多要注意的,或者你简单使用SeeStar将BMP转成DAT直接读取。
 楼主| 发表于 2006-8-25 13:53:51 | 显示全部楼层
看来BMP好复杂的说……
恩,那我试试看SeeStar,
谢谢7楼和8楼。~
不过To:7楼,为什么文件大小为1600B呢?
发表于 2006-8-25 13:55:55 | 显示全部楼层
因为160*80的单色图像的数据大小为:160 * 80 / 8 = 1600 Bytes
 楼主| 发表于 2006-8-25 14:00:27 | 显示全部楼层
已成功解决问题~!谢谢各位大侠们~!
发表于 2006-8-25 14:13:17 | 显示全部楼层
引用第9楼proevol2006-08-25 13:53发表的“”:
看来BMP好复杂的说……
恩,那我试试看SeeStar,
谢谢7楼和8楼。~
不过To:7楼,为什么文件大小为1600B呢?
每个点 用1 bit 来表示状态
整个屏幕有 160*80 bit
1Byte = 8bit
所以一个屏幕要 160*80/8 B=1600B

-------------------------------------------------
 楼主| 发表于 2006-8-25 19:35:18 | 显示全部楼层
哦,这样啊~我当时在想为什么不是12800呢。。原来是1B=8b啊。
谢谢了~
发表于 2006-8-25 20:32:54 | 显示全部楼层
准确地说,1个字节控制8个点。
 楼主| 发表于 2006-8-25 09:19:11 | 显示全部楼层 |阅读模式
首先声明一下,我是刚学LAVA的,东西都不太懂~BASIC的时候也没有怎么用到显图的操作~所以呢……问个笨笨的问题啦~还请高手解答,谢谢!

一张160*80的图片,为单色bmp图片,直接把后缀名改成".dat",用LAVA读~

原图片:

logo1

logo1

然后用了以下代码(代码有点烦啦~有些是直接从帮助里copy过来的,连变量的名字都没有改~~):
  1. void main()
  2. {
  3.   char logo[1600];
  4.   char fp;
  5.   char t;
  6.   int i,j;[size=3][/size]
  7.   if ((fp=fopen("/LavaData/logo1.dat","r"))==0)
  8.       printf("创建文件失败!");
  9.   else
  10.   {
  11.    for(i=1;i<=1600;i++)
  12.    {
  13.     if(feof(fp)==0)
  14.     {
  15.       logo[i]=getc(fp);
  16.     }
  17.    }
  18.   }
  19.   fclose(fp);
  20.   ClearScreen();
  21.   WriteBlock(0,0,160,80,1,logo);
  22.   Refresh();
  23.   getchar();
  24. }
复制代码
然后显示出来的图片:

err1

err1


怎么办啊?
虽然读进去了,但显示出来又是错位,又是反的。我汗- -bbb

曾经用pictocode转换以后放在dat里面。就如
  1. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  2. 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  3. 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  4. 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  5. 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  6. 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  7. 0x30, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0,
  8. 0x31, 0xFF, 0xFF, 0xC0, 0x03, 0xFF, 这种东西~
  9. 但是我也不会读,按照刚才的办法读的话,读进去好像是花屏??~~
  10. 还请高手指点指点,如何从文件中将图片读入并且显示?~谢谢!
复制代码
您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

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

GMT+8, 2024-4-19 09:05 , Processed in 0.011663 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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