用c做了一个读取24位深度的bmp图像的,
输入的图片是长度和宽度是181*63
#include <stdio.h>
#include <stdlib.h>#pragma pack(1) //设置结构体的边界对齐为1个字节,也就是所有数据在内存中是连续存储的。typedef unsigned short WORD; // 2
typedef unsigned long DWORD; // 4
typedef long LONG; // 4
typedef unsigned char BYTE; //1typedef struct tagBITMAPFILEHEADER { // bmfh 14个字节
WORD bfType; // 位图文件的类型,必须为BM
DWORD bfSize; // 图片的大小,以字节为单位,
WORD bfReserved1; // 位图文件保留字,必须为0
WORD bfReserved2; // 位图文件保留字,必须为0
DWORD bfOffBits; // 位图数据的起始位置,以相对于位图文件头的偏移量表示,以字节为单位,54个字节
} BITMAPFILEHEADER; // BITMAPFILEHEADER代表一个结构体类型typedef struct tagBITMAPINFOHEADER{ // bmih 40个字节
DWORD biSize; // 本结构所占用字节数
LONG biWidth; // 位图的宽度,以像素为单位
LONG biHeight; // 位图的高度,以像素为单位
WORD biPlanes; // 目标设备的级别,必须为1
WORD biBitCount;// 每个像素所需的位数,必须是1(双色),4(16色),8(256色)或24(真彩色)之一
DWORD biCompression; // 位图压缩类型,必须是 0(不压缩),1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一
DWORD biSizeImage; // 位图的大小,以字节为单位
LONG biXPelsPerMeter; // 位图水平分辨率,每米像素数
LONG biYPelsPerMeter; // 位图垂直分辨率,每米像素数
DWORD biClrUsed;// 位图实际使用的颜色表中的颜色数
DWORD biClrImportant;// 位图显示过程中重要的颜色数
} BITMAPINFOHEADER; typedef struct tagPOINT{ //3个字节
BYTE b;
BYTE g;
BYTE r;
} POINT;int quit();int quit()
{
puts("File's format wrong");
exit(0);
}void main ()
{
FILE *fi,*fo;//I/O file
char fin[80],fon[80];//I/O file name
BYTE buff,o=0;
BITMAPFILEHEADER bf;//位图头文件结构体
BITMAPINFOHEADER bi;//位图信息头结构体
POINT **p;//颜色分量指针
int i,j,t;
printf("orginfile name:");
scanf("%s",fin);
printf("resultfile name:");
scanf("%s",fon); printf("shuru t\n");
scanf("%d",&t);
if (((fi=fopen(fin,"rb"))==NULL)||((fo=fopen(fon,"wb"))==NULL)) //打开文件,新建文件
{
puts("\nfile open failed"); //文件打开失败
return;
} fread(&bf,sizeof(bf),1,fi);//读入数据
fread(&bi,sizeof(bi),1,fi); if(bf.bfType!=0x4d42) quit(); //文件的类型,b是4D,m是42,代表bmp类型的图片
if(bf.bfReserved1!=0x0000) quit();
if(bf.bfReserved2!=0x0000) quit(); if(bi.biClrImportant!=0) quit();//颜色是否重要
if(bi.biBitCount!=0x18) quit();//24色位
if(bi.biCompression!=0) quit();//没有压缩的
if(bi.biPlanes!=1) quit(); bf.bfSize=54+1024+bi.biWidth*bi.biHeight;//从第54个字节开始就是位图阵列,修改转换后图像的大小
bf.bfOffBits=54+1024;//修改转换后的偏移量 if(bi.biWidth%4==0)
bi.biSizeImage=bi.biWidth*bi.biHeight*bi.biBitCount/8;
else
bi.biSizeImage=(bi.biWidth-(bi.biWidth%4)+4)*bi.biHeight*bi.biBitCount/8; bi.biBitCount=8;
p=(POINT **)malloc(sizeof(POINT *)*bi.biHeight);
for (i=0;i<bi.biHeight;i++)
*(p+i)=(POINT *)malloc(sizeof(POINT)*bi.biWidth);//为每一个像素申请内存 fwrite(&bf,sizeof(bf),1,fo);//将新的文件头写入新的文件
fwrite(&bi,sizeof(bi),1,fo);//将位图信息头写入新的文件 for (i=bi.biHeight-1;i>=0;i--)
for (j=0;j<bi.biWidth;j++)
fread(*(p+i)+j,sizeof(POINT),1,fi);//读取图片数据 for (i=0x00,buff=0x00;i<=0xFF;i++,buff++)//写入新位图文件的调色板
{
fwrite(&buff,sizeof(buff),1,fo);//
fwrite(&buff,sizeof(buff),1,fo);
fwrite(&buff,sizeof(buff),1,fo);
fwrite(&o,sizeof(o),1,fo); //调色板结构中保留字单元需为0
} for (i=0;i<bi.biHeight;i++)
{
for (j=0;j<bi.biWidth;j++)
{ //将原图像转换为二值化的灰度图像
buff=((*(p+i)+j)->r*30+(*(p+i)+j)->g*59+(*(p+i)+j)->b*11)/100;
buff=(buff>=t?1:0);
fwrite(&buff,sizeof(buff),1,fo);
printf("%d",buff);
} printf("\n");
}
fclose(fo);
}问题:
我用终端输出二值化的图像,发现图像时倾斜的,我觉得应该是位置指针不对,希望各位大侠不吝赐教,谢谢!
输入的图片是长度和宽度是181*63
#include <stdio.h>
#include <stdlib.h>#pragma pack(1) //设置结构体的边界对齐为1个字节,也就是所有数据在内存中是连续存储的。typedef unsigned short WORD; // 2
typedef unsigned long DWORD; // 4
typedef long LONG; // 4
typedef unsigned char BYTE; //1typedef struct tagBITMAPFILEHEADER { // bmfh 14个字节
WORD bfType; // 位图文件的类型,必须为BM
DWORD bfSize; // 图片的大小,以字节为单位,
WORD bfReserved1; // 位图文件保留字,必须为0
WORD bfReserved2; // 位图文件保留字,必须为0
DWORD bfOffBits; // 位图数据的起始位置,以相对于位图文件头的偏移量表示,以字节为单位,54个字节
} BITMAPFILEHEADER; // BITMAPFILEHEADER代表一个结构体类型typedef struct tagBITMAPINFOHEADER{ // bmih 40个字节
DWORD biSize; // 本结构所占用字节数
LONG biWidth; // 位图的宽度,以像素为单位
LONG biHeight; // 位图的高度,以像素为单位
WORD biPlanes; // 目标设备的级别,必须为1
WORD biBitCount;// 每个像素所需的位数,必须是1(双色),4(16色),8(256色)或24(真彩色)之一
DWORD biCompression; // 位图压缩类型,必须是 0(不压缩),1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一
DWORD biSizeImage; // 位图的大小,以字节为单位
LONG biXPelsPerMeter; // 位图水平分辨率,每米像素数
LONG biYPelsPerMeter; // 位图垂直分辨率,每米像素数
DWORD biClrUsed;// 位图实际使用的颜色表中的颜色数
DWORD biClrImportant;// 位图显示过程中重要的颜色数
} BITMAPINFOHEADER; typedef struct tagPOINT{ //3个字节
BYTE b;
BYTE g;
BYTE r;
} POINT;int quit();int quit()
{
puts("File's format wrong");
exit(0);
}void main ()
{
FILE *fi,*fo;//I/O file
char fin[80],fon[80];//I/O file name
BYTE buff,o=0;
BITMAPFILEHEADER bf;//位图头文件结构体
BITMAPINFOHEADER bi;//位图信息头结构体
POINT **p;//颜色分量指针
int i,j,t;
printf("orginfile name:");
scanf("%s",fin);
printf("resultfile name:");
scanf("%s",fon); printf("shuru t\n");
scanf("%d",&t);
if (((fi=fopen(fin,"rb"))==NULL)||((fo=fopen(fon,"wb"))==NULL)) //打开文件,新建文件
{
puts("\nfile open failed"); //文件打开失败
return;
} fread(&bf,sizeof(bf),1,fi);//读入数据
fread(&bi,sizeof(bi),1,fi); if(bf.bfType!=0x4d42) quit(); //文件的类型,b是4D,m是42,代表bmp类型的图片
if(bf.bfReserved1!=0x0000) quit();
if(bf.bfReserved2!=0x0000) quit(); if(bi.biClrImportant!=0) quit();//颜色是否重要
if(bi.biBitCount!=0x18) quit();//24色位
if(bi.biCompression!=0) quit();//没有压缩的
if(bi.biPlanes!=1) quit(); bf.bfSize=54+1024+bi.biWidth*bi.biHeight;//从第54个字节开始就是位图阵列,修改转换后图像的大小
bf.bfOffBits=54+1024;//修改转换后的偏移量 if(bi.biWidth%4==0)
bi.biSizeImage=bi.biWidth*bi.biHeight*bi.biBitCount/8;
else
bi.biSizeImage=(bi.biWidth-(bi.biWidth%4)+4)*bi.biHeight*bi.biBitCount/8; bi.biBitCount=8;
p=(POINT **)malloc(sizeof(POINT *)*bi.biHeight);
for (i=0;i<bi.biHeight;i++)
*(p+i)=(POINT *)malloc(sizeof(POINT)*bi.biWidth);//为每一个像素申请内存 fwrite(&bf,sizeof(bf),1,fo);//将新的文件头写入新的文件
fwrite(&bi,sizeof(bi),1,fo);//将位图信息头写入新的文件 for (i=bi.biHeight-1;i>=0;i--)
for (j=0;j<bi.biWidth;j++)
fread(*(p+i)+j,sizeof(POINT),1,fi);//读取图片数据 for (i=0x00,buff=0x00;i<=0xFF;i++,buff++)//写入新位图文件的调色板
{
fwrite(&buff,sizeof(buff),1,fo);//
fwrite(&buff,sizeof(buff),1,fo);
fwrite(&buff,sizeof(buff),1,fo);
fwrite(&o,sizeof(o),1,fo); //调色板结构中保留字单元需为0
} for (i=0;i<bi.biHeight;i++)
{
for (j=0;j<bi.biWidth;j++)
{ //将原图像转换为二值化的灰度图像
buff=((*(p+i)+j)->r*30+(*(p+i)+j)->g*59+(*(p+i)+j)->b*11)/100;
buff=(buff>=t?1:0);
fwrite(&buff,sizeof(buff),1,fo);
printf("%d",buff);
} printf("\n");
}
fclose(fo);
}问题:
我用终端输出二值化的图像,发现图像时倾斜的,我觉得应该是位置指针不对,希望各位大侠不吝赐教,谢谢!
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货