| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3948 人关注过本帖, 1 人收藏
标题:请教,关于基础的bmp图片解析
只看楼主 加入收藏
qdcs
Rank: 6Rank: 6
等 级:侠之大者
威 望:5
帖 子:171
专家分:458
注 册:2016-12-22
收藏
得分:0 
D:\CC\test.bmp 创建这个文件之后编译后运行这段程序就行


我是硬件工程师
2017-02-02 12:07
ergg
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2016-5-20
收藏
得分:0 
回复 8楼 qdcs
话说。。。

「输入坐标(x,y),能自动输出处点(x,y)的颜色信息。」

也能帮我写一下吗。。。好人一生平安。。。

2017-02-02 15:51
绿意盎然
Rank: 2
来 自:湖北
等 级:论坛游民
帖 子:47
专家分:60
注 册:2017-1-5
收藏
得分:0 
2017-02-03 09:15
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
以下是引用ergg在2017-2-2 15:51:00的发言:

话说。。。

「输入坐标(x,y),能自动输出处点(x,y)的颜色信息。」

也能帮我写一下吗。。。好人一生平安。。。

坐标(x,y)具体指什么?是BMP文件数据固有的某像素点颜色信息,还是BMP图片显示在逻辑屏幕中某像素点颜色信息?
2017-02-03 09:38
ergg
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2016-5-20
收藏
得分:0 
回复 14楼 吹水佬
是BMP文件数据固有的某像素点颜色信息。。。。。
2017-02-03 15:09
qdcs
Rank: 6Rank: 6
等 级:侠之大者
威 望:5
帖 子:171
专家分:458
注 册:2016-12-22
收藏
得分:0 
这个有点难,打开文件用眼看我可以告诉你,但是用程序的算法输出挺难;我试了一下输出不对

我是硬件工程师
2017-02-03 16:00
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
以下是引用ergg在2017-2-3 15:09:13的发言:

是BMP文件数据固有的某像素点颜色信息。。。。。

简单写个参考示例:当x=y时修改为红色(画45度角线)。
图片附件: 游客没有浏览图片的权限,请 登录注册

#include <stdio.h>
#include <stdlib.h>

#pragma pack (1)

typedef struct _BITMAP_FILE_HEADER_
{
    char type[2];
    int size;
    short reserved1;
    short reserved2;
    long offbits;
} BITMAP_FILE_HEADER, *PBITMAP_FILE_HEADER;

typedef struct _BITMAP_INFO_HEADER_
{
    int Size;
    int Width;
    int Height;
    short Planes;
    short BitCount;
    int Compression;
    int SizeImage;
    int XPelsPerMeter;
    int YPelsPerMeter;
    int ClrUsed;
    int ClrImportant;
} BITMAP_INFO_HEADER, *PBITMAP_INFO_HEADER;

typedef struct _RGBDATA_
{
    unsigned char B;
    unsigned char G;
    unsigned char R;
} RGBDATA, *PRGBDATA;

main()
{
    FILE *fp=fopen("test.bmp","rb");
    if (fp == NULL)
        return;
    BITMAP_FILE_HEADER bmpHead;
    BITMAP_INFO_HEADER bmpInfo;
    fread(&bmpHead, sizeof(BITMAP_FILE_HEADER), 1, fp);
    fread(&bmpInfo, sizeof(BITMAP_INFO_HEADER), 1, fp);
    if (bmpInfo.BitCount != 24)
    {
        fclose(fp);
        printf("%d位bmp,示例只针对24位bmp", bmpInfo.BitCount);
        return;
    }
    char *buf=(char *)malloc(bmpInfo.SizeImage);
    fread(buf, bmpInfo.SizeImage, 1, fp);
    fclose(fp);
    int lbytes = bmpInfo.Width*3 + bmpInfo.Width%4;
    char *p = buf;
    PRGBDATA pRBG;
    int y, x;
    for (y=0; y<bmpInfo.Height; y++,p+=lbytes)
    {
        pRBG = (PRGBDATA)p;
        for (x=0; x<bmpInfo.Width; x++,pRBG++)
        {
            if (x == y)
            {
                pRBG->B = 0;
                pRBG->G = 0;
                pRBG->R = 0xff; //x=y时修改为红色
            }
        }
    }
        //另存为 test2.bmp
    fp = fopen("test2.bmp","wb");
    fwrite(&bmpHead, sizeof(BITMAP_FILE_HEADER), 1, fp);
    fwrite(&bmpInfo, sizeof(BITMAP_INFO_HEADER), 1, fp);
    fwrite(buf, bmpInfo.SizeImage, 1, fp);
    fclose(fp);
    free(buf);
}

2017-02-03 22:39
qdcs
Rank: 6Rank: 6
等 级:侠之大者
威 望:5
帖 子:171
专家分:458
注 册:2016-12-22
收藏
得分:0 
我写了这个,输出的值不对,发出来请大家来更改
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

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

    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,54,fp); ///把文件头54个字节放到数组里
                               


 

     x1=wenjiantou[10]; //提取偏移量给x1
            

                                       

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

    printf ("%d  ",point[i]); //输出点的buf
                             



   return 0;
   fclose(fp);// 关闭文件
}


我是硬件工程师
2017-02-04 15:31
qdcs
Rank: 6Rank: 6
等 级:侠之大者
威 望:5
帖 子:171
专家分:458
注 册:2016-12-22
收藏
得分:0 
程序代码:
//盛杰瑞办公设备实验室
//输入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[54];  

   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,54,fp); ///把文件头54个字节放到数组里
                               


 

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

           for (i=0;i<3;i++)                              

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

    printf ("%d  ",point[i]); //输出点的buf


        for (i=0;i<90;i++)     //调试用               
 printf ("\n%x  ",*(fp+i));       //调试用
   return 0;
   fclose(fp);// 关闭文件
}  //改了一些问题,还是存在问题,输出值不对



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


我是硬件工程师
2017-02-04 16:45
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
最好提供test.bmp文件测试
2017-02-04 16:54
快速回复:请教,关于基础的bmp图片解析
数据加载中...
 
   



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

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