魔术教学硬币穿玻璃杯:C++位图操作
来源:百度文库 编辑:九乡新闻网 时间:2024/05/03 06:45:30
/**
*author:何金国。xiaoyanghuaban修改于2009.12.29.
*/
#include
#include //包括这个有文件
int main() //void 也可以不要, 想想为什么
{
FILE *fp=fopen("d:\\lena.raw","rb"); //打开原始图像文件lena.raw
if(fp==NULL)
{ printf("can not open lena.raw\n"); return 0; }
unsigned char *image[1000];//image[i]是一个指针
for(int i=0;i<512;i++)
{
image[i]=new unsigned char[512]; //申请512字节的内存空间, 把起始地址赋给image[i];
fread(image[i],1,512, fp);//图像读入
}
fclose(fp);//关闭图像
//可以考虑在此处加入图象处理函数
FILE *fp1=fopen("d:\\new.bmp","wb");//创建新的图像
if(fp1==NULL)
{ printf("can not open new.bmp"); return 0; }
int imageW=512; //宽度
int imageH=512; //高度
int storeW=imageW;
if (storeW%4!=0)
storeW+=(4-storeW%4);//将storew变成4的整数倍,不够就凑上。
//==================================================
//位图图像文件的基本格式:位图文件头、位图信息头、彩色表 、位图数据。一共四部分。
//*******************************************
BITMAPFILEHEADER bh; //位图头文件
bh.bfType = ((WORD)('M' << 8) | 'B'); // "BM" 或者ox4D42 ,文件的类型
bh.bfReserved1=0;//保留,必须设置为0
bh.bfReserved2=0;//保留,必须设置为0
bh.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256+storeW*imageH;
//注意此处用storeW;-----文件的大小 ------需要留意此处的计算!!!!!!!!!!!!!!!!!!!
bh.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256;//这里的计算!!!!
/*从文件头开始到实际的图像数据之间的字节偏移量。
这是由于位图信息头和调色把的长度会根据集体的情况而变化,使用这个部分可以直接定位图像数据*/
//================================================
BITMAPINFOHEADER bInfo; //位图信息头
bInfo.biSize=sizeof(BITMAPINFOHEADER); //说明 BITMAPINFOHEADER所需要的字节
bInfo.biWidth=imageW; //宽度
bInfo.biHeight=imageH; // 高度
bInfo.biPlanes=1; //目标设备的位面数,总是被设置为1
bInfo.biBitCount=8; //说明比特/像素的颜色深度 ,表示2的多少次方种颜色
bInfo.biCompression=BI_RGB; //图像的压缩类型
bInfo.biSizeImage=storeW*imageH; //图像的大小,以字节为单位。
bInfo.biXPelsPerMeter=0; //水平分辨率,0是一种简化问题的处理方法
bInfo.biYPelsPerMeter=0; //垂直分辨率, 同上
bInfo.biClrUsed=256; //说明位图实际使用的颜色表中的颜色索引数目,0表示所有的颜色数目
bInfo.biClrImportant=0; //说明对图像有重要影响的颜色的索引数目,0表示都重要
//====================================================
fwrite(&bh,sizeof(BITMAPFILEHEADER),1,fp1);//写入头文件
fwrite(&bInfo,sizeof(BITMAPINFOHEADER),1,fp1);//写入信息头
//=====================================================
RGBQUAD rgb; //位图彩色表 具有颜色分量属性
rgb.rgbReserved=0; //保留设置为0
//*********************************************
//==================================================
for(int i=0;i<256;i++)
{//写入彩色表
rgb.rgbBlue=rgb.rgbRed=rgb.rgbGreen=i;//代表灰图图像
fwrite(&rgb,sizeof(RGBQUAD),1,fp1);
}
for(int i=0;i<512;i++)
{//写入新的图像内容
//fwrite(image[511-i],1,512, fp1);//反向 输出
fwrite(image[i],1,512, fp1); //正向 输出
}
fclose(fp1);
}
*author:何金国。xiaoyanghuaban修改于2009.12.29.
*/
#include
#include
int main() //void 也可以不要, 想想为什么
{
FILE *fp=fopen("d:\\lena.raw","rb"); //打开原始图像文件lena.raw
if(fp==NULL)
{ printf("can not open lena.raw\n"); return 0; }
unsigned char *image[1000];//image[i]是一个指针
for(int i=0;i<512;i++)
{
image[i]=new unsigned char[512]; //申请512字节的内存空间, 把起始地址赋给image[i];
fread(image[i],1,512, fp);//图像读入
}
fclose(fp);//关闭图像
//可以考虑在此处加入图象处理函数
FILE *fp1=fopen("d:\\new.bmp","wb");//创建新的图像
if(fp1==NULL)
{ printf("can not open new.bmp"); return 0; }
int imageW=512; //宽度
int imageH=512; //高度
int storeW=imageW;
if (storeW%4!=0)
storeW+=(4-storeW%4);//将storew变成4的整数倍,不够就凑上。
//==================================================
//位图图像文件的基本格式:位图文件头、位图信息头、彩色表 、位图数据。一共四部分。
//*******************************************
BITMAPFILEHEADER bh; //位图头文件
bh.bfType = ((WORD)('M' << 8) | 'B'); // "BM" 或者ox4D42 ,文件的类型
bh.bfReserved1=0;//保留,必须设置为0
bh.bfReserved2=0;//保留,必须设置为0
bh.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256+storeW*imageH;
//注意此处用storeW;-----文件的大小 ------需要留意此处的计算!!!!!!!!!!!!!!!!!!!
bh.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256;//这里的计算!!!!
/*从文件头开始到实际的图像数据之间的字节偏移量。
这是由于位图信息头和调色把的长度会根据集体的情况而变化,使用这个部分可以直接定位图像数据*/
//================================================
BITMAPINFOHEADER bInfo; //位图信息头
bInfo.biSize=sizeof(BITMAPINFOHEADER); //说明 BITMAPINFOHEADER所需要的字节
bInfo.biWidth=imageW; //宽度
bInfo.biHeight=imageH; // 高度
bInfo.biPlanes=1; //目标设备的位面数,总是被设置为1
bInfo.biBitCount=8; //说明比特/像素的颜色深度 ,表示2的多少次方种颜色
bInfo.biCompression=BI_RGB; //图像的压缩类型
bInfo.biSizeImage=storeW*imageH; //图像的大小,以字节为单位。
bInfo.biXPelsPerMeter=0; //水平分辨率,0是一种简化问题的处理方法
bInfo.biYPelsPerMeter=0; //垂直分辨率, 同上
bInfo.biClrUsed=256; //说明位图实际使用的颜色表中的颜色索引数目,0表示所有的颜色数目
bInfo.biClrImportant=0; //说明对图像有重要影响的颜色的索引数目,0表示都重要
//====================================================
fwrite(&bh,sizeof(BITMAPFILEHEADER),1,fp1);//写入头文件
fwrite(&bInfo,sizeof(BITMAPINFOHEADER),1,fp1);//写入信息头
//=====================================================
RGBQUAD rgb; //位图彩色表 具有颜色分量属性
rgb.rgbReserved=0; //保留设置为0
//*********************************************
//==================================================
for(int i=0;i<256;i++)
{//写入彩色表
rgb.rgbBlue=rgb.rgbRed=rgb.rgbGreen=i;//代表灰图图像
fwrite(&rgb,sizeof(RGBQUAD),1,fp1);
}
for(int i=0;i<512;i++)
{//写入新的图像内容
//fwrite(image[511-i],1,512, fp1);//反向 输出
fwrite(image[i],1,512, fp1); //正向 输出
}
fclose(fp1);
}