> 백엔드 개발 > C++ > 순수 C/C의 부울 행렬에서 흑백 BMP 이미지를 만드는 방법은 무엇입니까?

순수 C/C의 부울 행렬에서 흑백 BMP 이미지를 만드는 방법은 무엇입니까?

DDD
풀어 주다: 2024-12-10 07:49:09
원래의
541명이 탐색했습니다.

How to Create a Monochrome BMP Image from a Boolean Matrix in Pure C/C  ?

순수 C/C에서 단색 BMP 이미지 생성

비트맵 이미지 파일은 디지털 이미지 저장에 널리 사용됩니다. 이 문서에서는 해당 행렬 요소가 true인 경우 픽셀이 흰색으로 설정되는 흑백 BMP 파일에 부울 행렬을 작성해야 하는 필요성에 대해 설명합니다.

BMP 헤더 이해

BMP 파일 형식에는 이미지에 대한 필수 정보가 포함된 특정 헤더 구조가 있습니다. 헤더는 파일 헤더와 정보 헤더의 두 부분으로 구성됩니다.

파일 헤더

  • 크기(14바이트): 파일 크기(바이트).
  • 식별자(2 bytes): 파일을 BMP로 식별하기 위한 서명 "BM".
  • 예약됨(4바이트): 향후 사용을 위해 예약됨(0으로 설정).
  • 이미지 데이터에 대한 오프셋(4바이트): 파일 시작 부분부터 픽셀 시작 부분까지의 오프셋(바이트) data.

정보 헤더

  • 크기(40바이트): 정보 헤더의 크기
  • 너비(4바이트): 이미지의 너비 단위는 픽셀입니다.
  • 높이(4바이트): 이미지의 높이(픽셀)입니다.
  • 평면(2바이트): 항상 다음으로 설정됩니다. 1.
  • 비트 수(2바이트):픽셀당 1비트 흑백 이미지.
  • 압축(4바이트): 비압축의 경우 0.
  • 이미지 데이터 크기(4바이트): 픽셀 데이터(바이트).
  • XPelsPerMeter 및 YPelsPerMeter(4바이트) 각각): 이미지의 수평 및 수직 해상도(미터당 픽셀 단위).
  • 색상 팔레트(4바이트): 팔레트의 색상 수(단색의 경우 0으로 설정) 이미지).
  • 중요한 색상(4바이트): 팔레트의 중요 색상 수입니다. 흑백 이미지).

단색 BMP 생성

단색 BMP를 생성하려면:

  1. 파일 크기와 오프셋 계산 이미지 데이터에 추가합니다.
  2. 파일 헤더와 정보 헤더를 적절하게 초기화합니다. 값.
  3. 행렬을 나타내는 부울의 2D 배열을 만듭니다.
  4. 부울 값을 픽셀 값으로 변환합니다(거짓은 0, 참은 255).
  5. 파일 쓰기 헤더를 파일에 씁니다.
  6. 정보 헤더를 파일에 씁니다. 파일.
  7. 픽셀 데이터를 반복하여 파일에 씁니다.
  8. 정렬을 보장하기 위해 각 행을 4바이트의 배수로 채웁니다.
  9. 파일을 닫습니다.

예제 코드

다음 C/C 코드는 부울 행렬에서 단색 BMP를 생성하는 방법을 보여줍니다.

#include <stdio.h>
#include <stdlib.h>

int main() {
    FILE *f;
    unsigned char *img = NULL;
    int filesize = 54 + 3*w*h;  //w is your image width, h is image height, both int

    img = (unsigned char *)malloc(3*w*h);
    memset(img,0,3*w*h);

    for(int i=0; i<w; i++)
    {
        for(int j=0; j<h; j++)
        {
            bool = matrix[i][j]
            x=i; y=(h-1)-j;
            r = bool? 255 : 0;
            g = bool? 255 : 0;
            b = bool? 255 : 0;
            img[(x+y*w)*3+2] = (unsigned char)(r);
            img[(x+y*w)*3+1] = (unsigned char)(g);
            img[(x+y*w)*3+0] = (unsigned char)(b);
        }
    }

    unsigned char bmpfileheader[14] = {'B','M', 0,0,0,0, 0,0, 0,0, 54,0,0,0};
    unsigned char bmpinfoheader[40] = {40,0,0,0, 0,0,0,0, 0,0,0,0, 1,0, 24,0};
    unsigned char bmppad[3] = {0,0,0};

    bmpfileheader[ 2] = (unsigned char)(filesize    );
    bmpfileheader[ 3] = (unsigned char)(filesize>> 8);
    bmpfileheader[ 4] = (unsigned char)(filesize>>16);
    bmpfileheader[ 5] = (unsigned char)(filesize>>24);

    bmpinfoheader[ 4] = (unsigned char)(       w    );
    bmpinfoheader[ 5] = (unsigned char)(       w>> 8);
    bmpinfoheader[ 6] = (unsigned char)(       w>>16);
    bmpinfoheader[ 7] = (unsigned char)(       w>>24);
    bmpinfoheader[ 8] = (unsigned char)(       h    );
    bmpinfoheader[ 9] = (unsigned char)(       h>> 8);
    bmpinfoheader[10] = (unsigned char)(       h>>16);
    bmpinfoheader[11] = (unsigned char)(       h>>24);

    f = fopen("img.bmp","wb");
    fwrite(bmpfileheader,1,14,f);
    fwrite(bmpinfoheader,1,40,f);
    for(int i=0; i<h; i++)
    {
        fwrite(img+(w*(h-i-1)*3),3,w,f);
        fwrite(bmppad,1,(4-(w*3)%4)%4,f);
    }

    free(img);
    fclose(f);

    return 0;
}
로그인 후 복사

이 코드는 부울 행렬 행렬을 가져와 지정된 너비(w)와 높이(h)를 가진 흑백 BMP 이미지를 생성합니다. 부울 값을 픽셀 값으로 변환하고 BMP 파일을 디스크에 씁니다.

위 내용은 순수 C/C의 부울 행렬에서 흑백 BMP 이미지를 만드는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿