linux下不用MFC如何读取和存储.bmp文件

jinliang123 2006-12-21 03:53:59
在linux下不能用MFC,用纯C或C++来做的话真的很麻烦,跪求老大们给个代码,我慢慢研究。
...全文
281 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
argenCHN 2006-12-22
  • 打赏
  • 举报
回复
up
jixingzhong 2006-12-21
  • 打赏
  • 举报
回复
结构体定义:

typedef struct
{
int bfType; /* 文件类型, 必须为 "BM" (0x4D42) */
long bfSize; /* 文件的大小(字节) */
int bfReserved1; /* 保留, 必须为 0 */
int bfReserved2; /* 保留, 必须为 0 */
long bfoffBits; /* 位图阵列相对于文件头的偏移量(字节) */
} BITMAPFILEHEADER; /* 文件头结构 */

typedef struct
{
long biSize; /* size of BITMAPINFOHEADER */
long biWidth; /* 位图宽度(像素) */
long biHeight; /* 位图高度(像素) */
int biPlanes; /* 目标设备的位平面数, 必须置为1 */
int biBitCount; /* 每个像素的位数, 1,4,8或24 */
long biCompress; /* 位图阵列的压缩方法,0=不压缩 */
long biSizeImage; /* 图像大小(字节) */
long biXPelsPerMeter; /* 目标设备水平每米像素个数 */
long biYPelsPerMeter; /* 目标设备垂直每米像素个数 */
long biClrUsed; /* 位图实际使用的颜色表的颜色数 */
long biClrImportant; /* 重要颜色索引的个数 */
} BITMAPINFOHEADER; /* 位图信息头结构 */

typedef struct
{
USGC rgbBlue;
USGC rgbGreen;
USGC rgbRed;
USGC rgbReserved;
} RGBQUAD;
jixingzhong 2006-12-21
  • 打赏
  • 举报
回复
#include "windows.h" //这个注释掉

FILE *in, *out;
unsigned char b1;
BITMAPFILEHEADER bfile; // 下面三个需要自己定义
BITMAPINFOHEADER binfo;
RGBQUAD *bquad;

其他操作类似方式就可以了
比如显示,
读取 bmp 文件后显示出来就可以了 ~~
jixingzhong 2006-12-21
  • 打赏
  • 举报
回复
这个程序是把BMP彩图转成灰度图:
#include <stdio.h>
#include <stdlib.h>
#include "windows.h"

FILE *in, *out;
unsigned char b1;
BITMAPFILEHEADER bfile;
BITMAPINFOHEADER binfo;
RGBQUAD *bquad;
bool truecolor;
char infilename[100], outfilename[100]="done_";

bool read1();
void write1();
void init();
void getType();
void change();
void change2();

/****************************** main ****************************/
int main()
{
init();
getType();
if (truecolor) change();
else change2();

fclose(in);
fclose(out);

return 0;
}

void init()
{
printf("input the BMP file name:");
scanf("%s", infilename);
in = fopen(infilename, "rb");
if (in)
{
fread(&bfile, sizeof(bfile), 1, in);
fread(&binfo, sizeof(binfo), 1, in);
strcat(outfilename, infilename);
out = fopen(outfilename, "wb");
fwrite(&bfile, sizeof(bfile), 1, out);
fwrite(&binfo, sizeof(binfo), 1, out);
}
else
{
printf("Open File Error! No such file!\n");
exit(0);
}
}

bool read1()
{
if ( fread(&b1, sizeof(b1), 1, in) == 0) return false;
return true;
}
void write1()
{
fwrite(&b1, sizeof(b1), 1, out);
}

void getType()
{
truecolor = binfo.biBitCount==24 ? true:false;
printf("This is %dbit BMP .\n", binfo.biBitCount);
printf("The output file is : %s\n", outfilename);
}

void change()
{
int tot;
while( read1()==true )
{
tot = b1;
read1();
tot += b1;
read1();
tot += b1;
tot /= 3;
b1 = (unsigned char)tot;
write1();
write1();
write1();
}
}
void change2()
{
unsigned int i, n, tot;

n = (1 <<binfo.biBitCount);
bquad = (RGBQUAD *)malloc(sizeof(RGBQUAD)*n);
fread(bquad, sizeof(RGBQUAD), n, in);
/*
printf("N=%d\n", n);
for (i=0; i<n; ++i)
printf("RGB[%d] = %d %d %d\n", i, bquad[i].rgbRed, bquad[i].rgbGreen, bquad[i].rgbBlue);
*/
for (i=0; i<n; ++i)
{
tot = (bquad[i].rgbBlue + bquad[i].rgbGreen + bquad[i].rgbRed)/3 ;
bquad[i].rgbBlue = bquad[i].rgbGreen = bquad[i].rgbRed = (BYTE)tot;
}
fwrite(bquad, sizeof(RGBQUAD), n, out);
while( read1()==true ) write1();
}

说明一下:24位真彩色和256色,16色的存储方式是不一样的.
24位真彩色是直接存颜色值.它的处理函数是change()
256色和16色是按调色版来索引颜色的,数据区都是颜色的索引值.
索引值可以在change2()中读出来.
jinliang123 2006-12-21
  • 打赏
  • 举报
回复
当然还要对.bmp文件进行简单处理,也就是还要分析bmp结构。
caocheng8230 2006-12-21
  • 打赏
  • 举报
回复
你可以年年开源代码bmp2png中的BMP是怎样打开和保存的.
caocheng8230 2006-12-21
  • 打赏
  • 举报
回复
GNUWin32的bmp2png有它的实现
intuition444 2006-12-21
  • 打赏
  • 举报
回复
用linux下C的库函数不就可以吗?
fopen(),
fclose(),
fread(),
fwrite().
【源码免费下载链接】:https://renmaiwang.cn/s/2owjo 在本文中,我们将深入探讨如何使用Microsoft Foundation Class (MFC)、Visual Studio 2013和OpenCV库来打开并显示存储在任意路径下的图片。无论图片的格式是JPEG、PNG、BMP还是其他常见格式,我们都可以通过OpenCV进行处理,并选择以原图或灰度图的形式展示。让我们了解MFC、VS2013和OpenCV的基本概念。MFC(Microsoft Foundation Classes)是微软提供的一套C++类库,它基于面向对象的编程理念,为开发Windows应用程序提供了便利。MFC封装了许多Windows API,使得开发者能够更高效地创建用户界面和应用程序逻辑。Visual Studio 2013是微软的集成开发环境(IDE),它支持多种编程语言,包括C++,并提供了丰富的工具和功能,如调试器、代码编辑器和项目管理等,便于开发人员构建各种类型的应用程序。OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,包含了大量的图像处理和计算机视觉算法。它支持多种平台,如Windows、Linux和Mac OS,并且提供C++, C, Python等多种语言的接口。OpenCV广泛应用于图像分析、识别、机器学习等领域。要实现“MFC+VS2013+OpenCV打开任意路径下的图片并显示”,我们需要以下步骤:1. **配置环境**:首先确保已经安装了Visual Studio 2013,并在项目中包含OpenCV库。这通常涉及到添加库的路径到项目设置中,以及链接所需的OpenCV库文件。2. **创建MFC应用程序**:在VS2013中,选择“文件”->“新建”->“项目”,然后选择MFC应用程序模

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧