#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#pragma pack(push, 1)
typedef struct _BITMAPFILEHEADER
{
unsigned short bfType;
unsigned int bfSize;
unsigned short bfReserved1;
unsigned short bfReserved2;
unsigned int bfOffBits;
} BITMAPFILEHEADER;
typedef struct _BITMAPINFOHEADER
{
unsigned int biSize;
int biWidth;
int biHeight;
unsigned short biPlanes;
unsigned short biBitCount;
unsigned int biCompression;
unsigned int biSizeImage;
int biXPelsPerMeter;
int biYPelsPerMeter;
unsigned int biClrUsed;
unsigned int biClrImportant;
} BITMAPINFOHEADER;
typedef struct _RGBTRIPLE
{
unsigned char rgbtBlue;
unsigned char rgbtGreen;
unsigned char rgbtRed;
} RGBTRIPLE;
#pragma pack(pop)
#define PIXEL_SIZE 3
#define PIXEL_ALIGN 4
int main()
{
FILE *fpBmp;
BITMAPFILEHEADER fileHeader;
BITMAPINFOHEADER infoHeader;
unsigned char *image;
int size;
int width, height;
int padding;
char ascii[] = { '9', '8', '7', '6', '5', '4', '3', '2', '1', '0', ' ' };
fpBmp = fopen("sample50x50.bmp", "rb");
if (fpBmp == NULL)
return 0;
if (fread(&fileHeader, sizeof(BITMAPFILEHEADER), 1, fpBmp) < 1)
{
fclose(fpBmp);
return 0;
}
if (fileHeader.bfType != 'MB')
{
fclose(fpBmp);
return 0;
}
if (fread(&infoHeader, sizeof(BITMAPINFOHEADER), 1, fpBmp) < 1)
{
fclose(fpBmp);
return 0;
}
if (infoHeader.biBitCount != 24)
{
fclose(fpBmp);
return 0;
}
size = infoHeader.biSizeImage;
width = infoHeader.biWidth;
height = infoHeader.biHeight;
padding = (PIXEL_ALIGN - ((width * PIXEL_SIZE) % PIXEL_ALIGN)) % PIXEL_ALIGN;
if (size == 0)
{
size = (width * PIXEL_SIZE + padding) * height;
}
image = malloc(size);
fseek(fpBmp, fileHeader.bfOffBits, SEEK_SET);
if (fread(image, size, 1, fpBmp) < 1)
{
fclose(fpBmp);
return 0;
}
fclose(fpBmp);
for (int y = height - 1; y >= 0; y--)
{
for (int x = 0; x < width; x++)
{
int index = (x * PIXEL_SIZE) + (y * (width * PIXEL_SIZE)) + (padding * y);
RGBTRIPLE *pixel = (RGBTRIPLE *)&image[index];
unsigned char blue = pixel->rgbtBlue;
unsigned char green = pixel->rgbtGreen;
unsigned char red = pixel->rgbtRed;
unsigned char gray = (red + green + blue) / PIXEL_SIZE;
char c = ascii[gray * sizeof(ascii) / 256];
printf("%c", c);
}
printf("\n");
}
free(image);
return 0;
}
결과는 똑같이 출력되는거같은데 계속 틀렸다고 나오네요ㅠㅠ 어디가 잘못된건지 모르겠습니다
문제를 읽어보면
sample.bmp 파일이어야 합니다.
다만, 그림 크기가 커서 화면에 출력했을 때 제대로 알아보기 어려우니 작은 크기의 sample50x50.bmp로 테스트하라고 되어 있습니다.
그러니 코드를 작성하고 테스트할 때는 sample50x50.bmp로 테스트하지만, 제출할 때는 sample.bmp로 제출해야 합니다.
50x50으로 제출했을 때의 결과 예시가 있습니다.
화면에 글자가 출력된다고 풀이가 된 것이 아니고 정답이 아닙니다.
첫 번째 줄의 출력 결과를 보면
33332355554444444444444444444455333333320454444434
심사문제에서 sample50x50.bmp의 출력 예시 첫 줄을 보면
55555555435532112334554453222225335566543334555433
전혀 다른 값이기 때문에 로직 자체가 틀렸다는 것을 알 수 있습니다.
출력 결과를 보면
중간중간에 공백이 들어가 있는 것도 알 수 있습니다.
Visual Studio Code에서 출력 결과를 붙여 넣으면 작게 프리뷰가 표시됩니다.
피망 이미지가 아니죠.
출력 예시를 넣어보면 흐릿하지만, 피망 이미지라는 것을 알 수 있습니다.
포럼 상단 오른쪽에 81.7로 검색하면 이전 질문과 답변을 볼 수 있습니다. 이와 같이 숫자가 출력되니 정답이라고 문의한 이전 질문과 답변이 많이 있으니 살펴보면 힌트를 얻을 수 있을 겁니다.
초보는 값을 검증하지 않고 출력만 되면 코드가 동작한다고 생각하는 경향이 있습니다. 온라인 심사를 잘못된 습관을 잡아주는 훌륭한 도구입니다.