| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3949 人关注过本帖, 1 人收藏
标题:请教,关于基础的bmp图片解析
只看楼主 加入收藏
qdcs
Rank: 6Rank: 6
等 级:侠之大者
威 望:5
帖 子:171
专家分:458
注 册:2016-12-22
收藏
得分:0 
搞定了,原来有个fseek函数可以用,错的原因是fp并不能代表文件的真实位置。呵呵上代码和
程序代码:
//盛杰瑞办公设备实验室
//输入x,y坐标,输出改点图像rgb值
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{while(1){  FILE *fp;
    int i,x,y;   //x,y是坐标
    int  x1;     //真实坐标的偏移量
    int y1; //x坐标宽度
    unsigned char wenjiantou[100];  

   unsigned char point[3]; 

   if((fp=fopen("D:\\CC\\test.bmp","rb+"))==NULL)     // 打开磁盘文件 

    {
       printf("can't open file!\n");
       exit(0);
   }
   printf("要输出点的坐标是(用空格分开x y):");
   scanf ("%d %d",&x,&y);
   fread(&wenjiantou,1,100,fp); ///把文件头若干个字节放到数组里
                               


 

     x1=wenjiantou[10]; //提取偏移量给x1 
	
		
			
test.zip (631 Bytes)
y1=wenjiantou[18]; //提取宽度给y1 //for (i=0;i<3;i++) fseek(fp,(3*x+y1*y+x1),0); fread(&point,1,3,fp); //读取指定位置3个字节数据+(3*x+y1*y+x1) for (i=0;i<3;i++) printf ("%x ",point[i]); //输出点的buf 16进制方便观察 return 0; fclose(fp);}// 关闭文件} }
一个24位色的100*100的bmp图像
test.zip (631 Bytes)


[此贴子已经被作者于2017-2-4 18:11编辑过]


我是硬件工程师
2017-02-04 18:08
ergg
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2016-5-20
收藏
得分:0 
回复 20楼 吹水佬
谢谢!!太感谢了!!!

请问代码可以用visual studio直接运行吗?vs可以自动打开图片?
2017-02-04 18:42
ergg
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2016-5-20
收藏
得分:0 
回复 21楼 qdcs
太谢谢了!!!!好幸福啊哈哈哈

请问这个可以用Visual Studio直接运行打开测试图片吗? 还有要用别的软件?

2017-02-04 18:43
qdcs
Rank: 6Rank: 6
等 级:侠之大者
威 望:5
帖 子:171
专家分:458
注 册:2016-12-22
收藏
得分:0 
图片放到指定目录里d:\cc\里,,记得解压先。目录可以更改在程序代码中。不用感谢,我也新手,共同进步。

我是硬件工程师
2017-02-04 19:20
ergg
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2016-5-20
收藏
得分:0 
回复 24楼 qdcs
好!!
2017-02-04 20:01
C初见
Rank: 2
来 自:四川
等 级:论坛游民
帖 子:61
专家分:52
注 册:2017-1-7
收藏
得分:0 
学习了,但是看不懂,都学了两个月了,还在看指针,这正常吗
2017-02-04 21:24
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
回复 21楼 qdcs
看代码好象没考虑行字节对齐问题?
试试24位111*111的bmp
2017-02-05 06:43
qdcs
Rank: 6Rank: 6
等 级:侠之大者
威 望:5
帖 子:171
专家分:458
注 册:2016-12-22
收藏
得分:0 
感谢吹水佬,我有发奋了一下,把抄来的4字节对齐算法放进去,同时发现原先算法上的错误,现在完美了。上新代码。
程序代码:
//盛杰瑞办公设备实验室
//输入x,y坐标,输出改点图像rgb值
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{   FILE *fp;
    int i,x,y;   //x,y是坐标
    int  x1;     //真实坐标的偏移量
    int y1; //x坐标宽度
    unsigned char wenjiantou[100];  

   unsigned char point[3]; 

    int m_iImageWidth,m_iBitsPerPixel,skip;



 while(1) {
   if((fp=fopen("D:\\CC\\test.bmp","rb+"))==NULL)     // 打开磁盘文件 

    {
       printf("can't open file!\n");
       exit(0);
   }
  printf("要输出点的坐标是(用空格分开x y):");
   scanf ("%d %d",&x,&y);
   fread(&wenjiantou,1,100,fp); ///把文件头若干个字节放到数组里
 

     x1=wenjiantou[10]; //提取偏移量给x1
    y1=wenjiantou[18]; //提取宽度给y1        

          

       ////////////每行对齐4字节要填充数据的位数skip
      

    m_iImageWidth=wenjiantou[18];    //\\读取文件宽度
    

     m_iBitsPerPixel=wenjiantou[28]; //\\读取文件每个像素的字节数
   skip = 4 - ((m_iImageWidth * m_iBitsPerPixel)>>3) & 3;  //每行对齐4字节要填充数据的位数skip
                                

  //////////////   

          

           fseek(fp,(3*x+3*y1*y+x1+y*skip),0);          //随机读取位置标记定位    原先这里忘记给y再乘以3了

          

       //printf("%d\n",(3*x+3*y1*y+x1+y*skip));    //调试用                        

     fread(&point,1,3,fp);    //读取指定位置3个字节数据+(3*x+y1*y+x1)
     for (i=0;i<3;i++)                       

    

    printf ("%x  ",point[i]); //输出点的buf 16进制方便观察
  }
   return 0;
   fclose(fp);}// 关闭文件}



[此贴子已经被作者于2017-2-5 17:27编辑过]


我是硬件工程师
2017-02-05 17:17
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
回复 28楼 qdcs
unsigned char wenjiantou[100];
int m_iImageWidth;
m_iImageWidth=wenjiantou[18];
m_iImageWidth只取低8位数值,当m_iImageWidth大于255时就不适用。
或者可以这样:
int *m_iImageWidth;
m_iImageWidth = &wenjiantou[18];
printf("%d\n", *m_iImageWidth);
2017-02-05 23:14
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
试写个直接从文件获取像素点颜色
#include <stdio.h>

char *_GetbmpRGB(char *bmpFileName, char *pRGB, int x, int y)
{
    FILE *fp;
    if ((fp=fopen(bmpFileName,"rb")) == NULL)
        return NULL;
    short bmpBitCount;   
    fseek(fp, 28, SEEK_SET);
    fread(&bmpBitCount, 2, 1, fp);
    if (bmpBitCount != 24)
    {
        fclose(fp);
        printf("%d位bmp,示例只针对24位bmp", bmpBitCount);
        return NULL;
    }
    int bmpWidth;
    fseek(fp, 18, SEEK_SET);
    fread(&bmpWidth, 4, 1, fp);
    int lbytes = bmpWidth*3 + bmpWidth%4;
    fseek(fp, 54 + y*lbytes + x*3, SEEK_SET);
    fread(pRGB, 3, 1, fp);
    fclose(fp);   
    return pRGB;
}

main()
{
    char *bmpFileName="test.bmp";
    int x, y;
    printf("输入像素点坐标(x y): ");
    scanf("%d %d",&x,&y);
    unsigned char aRGB[3];
    if (_GetbmpRGB(bmpFileName, aRGB, x, y) != NULL)     
        printf("R=0x%02x G=0x%02x B=0x%02x\n", aRGB[2],aRGB[1],aRGB[0]);
}
2017-02-05 23:16
快速回复:请教,关于基础的bmp图片解析
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.163226 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved