首页
社区
课程
招聘
[求助]关於c语言裁剪bmp图片问题
发表于: 2015-9-10 13:05 5486

[求助]关於c语言裁剪bmp图片问题

2015-9-10 13:05
5486
#include <stdio.h>
#include <stdlib.h>
#include<Windows.h>
struct color{
        unsigned char red;
        unsigned char green;
        unsigned char blue;
}color;

void main()
{
        BITMAPFILEHEADER file;
        BITMAPINFOHEADER info;
        FILE *p,*p1;
                int i,j;
                long x,y;
        struct color temp[20000];
        FILE *FileNumber;//文件号
        errno_t Error;//fopen_s用,需要的错误信息

       

        p=fopen("文件絕對路徑","r+");

       
        fread(&file,sizeof(BITMAPFILEHEADER),1,p);//头文件的读取与存储
        fread(&info,sizeof(BITMAPINFOHEADER),1,p);
        //fwrite(&file,sizeof(BITMAPFILEHEADER),1,p1);
        //fwrite(&info,sizeof(BITMAPINFOHEADER),1,p1);
        y=info.biHeight;//读取文件高度
        x=info.biWidth;//读取文件宽度
       
        //printf("%d %d\n",x,y);
        //if(file.bfType!=0x4d42)
        //{
        //        //检验是否为bmp文件
        //        printf("不是bmp图片\n");
        //        return;
        //}
        j=1;
    //for(i=1;i<=(int)x*(int)y*3;i=i+3)
       
                for(i=1;i<=250;i=i++)
        {
                fread(&color,sizeof(struct color),1,p);
        /*temp[i].blue=color.blue;
                temp[i+1].green=color.green;
                temp[i+2].red=color.red;*/
                printf("%x, %x, %x, %d\n",color.blue,color.green,color.red,i);
        }

       
       
        //for(i=1;i<=x;i++)
        //{//用for循环读取像素(这个bmp为24位,所以没有颜色表)
        //        for(j=1;j<=y;j++)
        //        {
        //                fread(&color,sizeof(struct color),1,p);
        //                temp[i][j].blue=color.blue;
        //                temp[i][j].green=color.green;
        //                temp[i][j].red=color.red;
        //                printf("%x, %x, %x\n",color.blue,color.green,color.red);

        //        }
        //}
        //for(i=1;i<=x;i++){//读取之后再存入文件
        //        for(j=1;j<=y;j++){
        //                fwrite(&temp[i][j],sizeof(struct color),1,p1);
        //        }
        //}
        /*fclose(p1);*/
        fclose(p);
        getchar();
       

}

我用了一张小图片,讀出來色碼是完全正確的
但用了大圖片,色碼完全出錯
這兩張圖片給各位大牛試試

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 35
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
木有道理阿,如代码出错,小图片的读色码也会出错的
2015-9-10 13:15
0
雪    币: 55
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我记得bmp文件会有4字节对齐的问题,是不是问题出在这里?
2015-9-10 13:22
0
雪    币: 704
活跃值: (3360)
能力值: ( LV7,RANK:140 )
在线值:
发帖
回帖
粉丝
4
应该是3楼说的边界对齐的问题吧。比如图片宽度是3像素,那么储存的时候应该是按4像素来储存的,空白像素补齐,读取的时候要跳过。其实可以不用管对齐,bmp文件格式中应该有一个Pitch参数,表示一行有几个字节。根据Pitch运算,按行来处理。

说错了,Pitch也是计算出来的,不是储存在bmp文件里的。Pitch=(((nWidth*nBPP)+31)/32)*4
nBPP就是biBitCount member of BITMAPINFOHEADER
2015-9-12 17:24
0
雪    币: 35
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
不懂你的意思阿哥,你的意思是色码的长度并不一?
2015-9-12 21:25
0
雪    币: 704
活跃值: (3360)
能力值: ( LV7,RANK:140 )
在线值:
发帖
回帖
粉丝
6
按照你的例子来看,假如一个像素3字节,那么就是24位的,nBPP就是24。假如图片宽度是4像素,那么计算 Pitch=(((nWidth*nBPP)+31)/32)*4,得到Pitch=12,图片中某一行的储存格式是:
B1 G1 R1 B2 G2 R2 B3 G3 R3 B4 G4 R4
你的算法应该不会出错。

但是假如图片宽度是3像素,那么计算Pitch的结果还是Pitch=12,图片中某一行的储存格式是:
B1 G1 R1 B2 G2 R2 B3 G3 R3 0 0 0
按照你的算法读取下一行的第一个像素(B1 G1 R1)就会读取到 0 0 0。所以出错
2015-9-13 13:17
0
雪    币: 35
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
不知道是不是这个意思?
上传的附件:
2015-9-13 21:47
0
雪    币: 704
活跃值: (3360)
能力值: ( LV7,RANK:140 )
在线值:
发帖
回帖
粉丝
8

这是储存的时候的样子。为了对齐,宽度3的多了一个空白像素
上传的附件:
2015-9-13 23:32
0
游客
登录 | 注册 方可回帖
返回
//