求助:C语言实现

张诚瑞 2019-04-17 11:01:21
我的编译环境是dev C++,目前写好了读取BMP头文件部分,已经可以读取出图片的属性信息了,代码如下:


#include <stdio.h>
#include <stdlib.h>
#pragma pack(1)

/* 定义WORD为两个字节的类型 */
typedef unsigned short WORD;
/* 定义DWORD为四个字节的类型 */
typedef unsigned int DWORD;

/* 位图文件头主要是对位图文件的一些描述 位图信息头主要是对位图图像方面信息的描述 */
/*************************** 位图标准信息(54字节) ******************************************/
/* 位图文件头 (位图头的字节数 = 位图文件字节数 - 位图图像数据字节数)*/
typedef struct BMP_FILE_HEADER
{
WORD bType; // 文件标识符
DWORD bSize; // 文件的大小
WORD bReserved1; // 保留值,必须设置为0
WORD bReserved2; // 保留值,必须设置为0
DWORD bOffset; // 文件头的最后到图像数据位开始的偏移量
} BMPFILEHEADER; // 14 字节

/* 位图信息头 */
typedef struct BMP_INFO
{
DWORD bInfoSize; // 信息头的大小
DWORD bWidth; // 图像的宽度
DWORD bHeight; // 图像的高度
WORD bPlanes; // 图像的位面数
WORD bBitCount; // 每个像素的位数
DWORD bCompression; // 压缩类型
DWORD bmpImageSize; // 图像的大小,以字节为单位
DWORD bXPelsPerMeter; // 水平分辨率
DWORD bYPelsPerMeter; // 垂直分辨率
DWORD bClrUsed; // 使用的色彩数
DWORD bClrImportant; // 重要的颜色数
} BMPINF0; // 40 字节

/* 彩色表:调色板 */
typedef struct RGB_QUAD
{
WORD rgbBlue; // 蓝色强度
WORD rgbGreen; // 绿色强度
WORD rgbRed; // 红色强度
WORD rgbReversed; // 保留值
} RGBQUAD;






int main()
{
int i = sizeof(BMPFILEHEADER);
int j = sizeof(long);
FILE *fp; // 定义一个文件指针
BMPFILEHEADER bmpFileHeader; // 定义一个 BMP 文件头的结构体
BMPINF0 bmpInfo; // 定义一个 BMP 文件信息结构体
MAPINFO mapinfo; // 定义一个 图片信息结构体

// "rb" 只读打开一个二进制文件,只允许读数据。'b'指的是让这个库函数以二进制形式打开此文件。
// 读取失败会返回空指针,读取成功后,fp 会指向一块具有 bmp 属性的内存,我们可以对这块内存开始操作
if((fp = fopen("ABC.bmp", "rb")) == NULL) // fp = 0x00426aa0
{
printf("Cann't open the file!\n");
return 0;
}

// 让 fp 指向 bmp 文件的开始
// 第 2 个参数是偏移量 第三个参数是文件起始地址 所以此函数执行成功后文件指针会指向文件的开始
fseek(fp, 0, SEEK_SET); // fp = 0x00426aa0

// 读取文件信息
fread(&bmpFileHeader, sizeof(BMPFILEHEADER), 1, fp);


fread(&bmpInfo, sizeof(bmpInfo), 1, fp);



// 输出BMP文件的位图文件头的所有信息
printf("位图文件头主要是对位图文件的一些描述:BMPFileHeader\n\n");
printf("文件标识符 = 0X%X\n", bmpFileHeader.bType);
printf("BMP 文件大小 = %d 字节\n", bmpFileHeader.bSize);
printf("保留值1 = %d \n", bmpFileHeader.bReserved1);
printf("保留值2 = %d \n", bmpFileHeader.bReserved2);
printf("文件头的最后到图像数据位开始的偏移量 = %d 字节\n", bmpFileHeader.bOffset);

// 输出BMP文件的位图信息头的所有信息
printf("\n\n位图信息头主要是对位图图像方面信息的描述:BMPInfo\n\n");
printf("信息头的大小 = %d 字节\n", bmpInfo.bInfoSize);
printf("位图的高度 = %d \n", bmpInfo.bHeight);
printf("位图的宽度 = %d \n", bmpInfo.bWidth);
printf("图像的位面数(位面数是调色板的数量,默认为1个调色板) = %d \n", bmpInfo.bPlanes);
printf("每个像素的位数 = %d 位\n", bmpInfo.bBitCount);
printf("压缩类型 = %d \n", bmpInfo.bCompression);
printf("图像的大小 = %d 字节\n", bmpInfo.bmpImageSize);
printf("水平分辨率 = %d \n", bmpInfo.bXPelsPerMeter);
printf("垂直分辨率 = %d \n", bmpInfo.bYPelsPerMeter);
printf("使用的色彩数 = %d \n", bmpInfo.bClrUsed);
printf("重要的色彩数 = %d \n", bmpInfo.bClrImportant);




fclose(fp);
while(1);
return 0;

}



基本可以运行,但是我不清楚应该怎样设定一个二维数组来读取图片的信息并处理

这个二维数组的要求应该是这样:大小为图片的长*宽,每一位数据的大小应该为每个像素的位数,

之前我尝试了fread(&mapinfo, bmpInfo.bHeight*bmpInfo.bWidth, 1, fp);来继续读取图片信息,但是直接报错了
Process exited with return value 3221225477
之前看了一些资料,好像要用到
#define WIDTHBYTES(i) ((i+31)/32*4)
但是不知道怎么用
我学的不精有些不太明白怎么操作,求指导
...全文
67 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
张诚瑞 2019-04-21
  • 打赏
  • 举报
回复
请问出现了一堆这个提示: undefined reference to `CreateCompatibleDC@4' 是怎么回事,我用的是DEV C++,没搞懂是环境的问题吗?
赵4老师 2019-04-17
  • 打赏
  • 举报
回复
仅供参考:
#pragma comment(lib,"gdi32")
#include <windows.h>
#include <stdio.h>

int main() {
    const DWORD uWidth = 18 + 17 * 256, uHeight = 18 + 17 * 128;

    PBITMAPINFO pbmi = (PBITMAPINFO) LocalAlloc (LPTR, sizeof (BITMAPINFOHEADER) + sizeof (RGBQUAD) * 2);
    pbmi->bmiHeader.biSize = sizeof (BITMAPINFOHEADER);
    pbmi->bmiHeader.biWidth = uWidth;
    pbmi->bmiHeader.biHeight = uHeight;
    pbmi->bmiHeader.biPlanes = 1;
    pbmi->bmiHeader.biBitCount = 1;
    pbmi->bmiHeader.biSizeImage = ((uWidth + 31) & ~31) / 8 * uHeight;
    pbmi->bmiColors[0].rgbBlue = 0;
    pbmi->bmiColors[0].rgbGreen = 0;
    pbmi->bmiColors[0].rgbRed = 0;
    pbmi->bmiColors[1].rgbBlue = 255;
    pbmi->bmiColors[1].rgbGreen = 255;
    pbmi->bmiColors[1].rgbRed = 255;

    HDC hDC = CreateCompatibleDC (0);
    void * pvBits;
    HBITMAP hBitmap = CreateDIBSection (hDC, pbmi, 0, &pvBits, NULL, 0);
    SelectObject (hDC, hBitmap);
    HFONT hFont = CreateFont (16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "宋体");
//  HFONT hFont = CreateFont (16, 0, 0, 0, 0, 0, 0, 0, SHIFTJIS_CHARSET, 0, 0, 0, 0, "宋体");
    SelectObject (hDC, hFont);
    BitBlt (hDC, 0, 0, uWidth, uHeight, NULL, 0, 0, WHITENESS);

    char c[4];
    int i, j;
    for (i = 128; i < 256; i++) {
        sprintf (c, "%02X", i);
        TextOut (hDC, 1, (i - 127) * 17 + 1, c, 2);
    }
    for (j = 0; j < 256; j++) {
        sprintf (c, "%02X", j);
        TextOut (hDC, (j + 1)* 17 + 1, 1, c, 2);
    }
    for (i = 128; i < 256; i++) {
        for (j = 0; j < 256; j++) {
            c[0] = (char) i;
            c[1] = (char) j;
            TextOut (hDC, (j + 1) * 17 + 1, (i - 127) * 17 + 1, c, 2);
        }
    }
    for (i = 0; i < 130; i++) {
        MoveToEx (hDC, 0, i * 17, NULL);
        LineTo (hDC, uWidth, i * 17);
    }
    for (j = 0; j < 258; j++) {
        MoveToEx (hDC, j * 17, 0, NULL);
        LineTo (hDC, j * 17, uHeight);
    }

    BITMAPFILEHEADER bmfh;
    bmfh.bfType = *(PWORD) "BM";
    bmfh.bfReserved1 = 0;
    bmfh.bfReserved2 = 0;
    bmfh.bfOffBits = sizeof (BITMAPFILEHEADER) + sizeof (BITMAPINFOHEADER) + sizeof (RGBQUAD) * 2;
    bmfh.bfSize = bmfh.bfOffBits + pbmi->bmiHeader.biSizeImage;

    HANDLE hFile = CreateFile ("goal.bmp", GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0);
    if (hFile != INVALID_HANDLE_VALUE) {
        DWORD dwWritten;
        WriteFile (hFile, &bmfh, sizeof (BITMAPFILEHEADER), &dwWritten, NULL);
        WriteFile (hFile, pbmi, sizeof (BITMAPINFOHEADER) + sizeof (RGBQUAD) * 2, &dwWritten, NULL);
        WriteFile (hFile, pvBits, pbmi->bmiHeader.biSizeImage, &dwWritten, NULL);

        CloseHandle (hFile);
    }

    DeleteObject (hFont);
    DeleteObject (hBitmap);
    DeleteDC (hDC);
    LocalFree (pbmi);

    return 0;
}

69,371

社区成员

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

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