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

순수 C/C의 부울 행렬에서 BMP 이미지를 작성하는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-19 09:06:10241검색

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

외부 라이브러리 없이 순수 C/C에 BMP 이미지 작성

부울 행렬을 사용하여 출력을 생성할 때 이를 BMP 파일이 생성됩니다. 여기에는 해당 행렬 요소가 참인 경우 흰색으로 표시된 픽셀이 있는 단색 이미지를 생성하는 작업이 포함됩니다. BMP 헤더 구조와 작성 프로세스를 이해하는 것이 여전히 과제입니다.

이 문제를 해결하기 위한 솔루션에는 빨간색, 녹색, 파란색의 세 가지 2D 배열을 생성하는 것이 포함되며, 각각은 매트릭스를 기반으로 픽셀 값을 나타냅니다. 다음 코드는 접근 방식을 보여줍니다.

FILE *f;
unsigned char *img = NULL;
int filesize = 54 + 3 * w * h; // Width and height represented as w and h

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++) {
        int x = i, y = (h - 1) - j; // Flipping the image vertically
        int r = red[i][j] * 255;
        int g = green[i][j] * 255;
        int b = blue[i][j] * 255;
        // Clamping RGB values between 0-255
        if (r > 255) r = 255;
        if (g > 255) g = 255;
        if (b > 255) b = 255;
        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);
    }
}

// Define BMP headers
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};

// Populate BMP header values
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); // Padding to ensure 4-byte alignment
}

free(img);
fclose(f);

이 접근 방식은 외부 라이브러리에 의존하지 않고 부울 행렬에서 BMP 파일을 작성하는 포괄적인 솔루션을 제공합니다. 헤더 구조는 세심하게 정의되어 있으며 코드는 적절한 픽셀 형식 및 패딩을 보장하여 표준 이미지 뷰어로 열 수 있는 유효한 BMP 이미지를 생성합니다.

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

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.