|
의견 몇가지.....
1. 님의 코드에는 FILE *fp 에서 BMP_DATA rgb[] 배열로 fread하는 부분이 없네요
2. 그리고 님처럼 코딩하시려면 bitmap 파일 format 을 정확히 아셔야 합니다.
저도 bitmap file format에 대해서는 잘모릅니다만
file로 부터 읽어올때 맨처음부터 rgb값으로 3byte씩 되어있지 않습니다.
그리고 모든 bmp파일이라고 같은 형식도 아니구요
파일의 맨 첫부분에 bmp header가 있는데..
header에 bitmap의 width 와 height , offset 등의 정보가 있습니다.
그리고 실제로 rgb순으로 file에 기록되지 않구요
또한 data가 맨첫번째 line부터 기록되지도 않습니다.
아래는 bitmap header입니다. 참조하세요
// bitmap header
#define __u32 unsigned int
#define __u16 unsigned short
#pragma pack(push,1) // builder에서 comfile하려면 꼭해줘야함
struct BMP_DATA // 비트맵 RGB값 , 순서가 바뀜
{
BYTE b;
BYTE g;
BYTE r;
};
typedef struct bmp_header {
/* Header */
char signature[2];
__u32 file_size;
__u32 reserved;
__u32 data_offset;
/* InfoHeader */
__u32 size;
__u32 width;
__u32 height;
__u16 planes;
__u16 bit_count;
__u32 compression;
__u32 image_size;
__u32 x_pixels_per_m;
__u32 y_pixels_per_m;
__u32 colors_used;
__u32 colors_important;
/* ColorTable */
} bmp_header_t;
#pragma pack(pop)
3. 다음 정상적으로 file에서 한 line씩 data를 읽어왔을경우에...
코딩에 문제가 없다고 가정하구요
3-1) bitmap파일의 image가 한 가운데에 하얀색이 있는 경우는 어떻게 되나요?
==> 안쪽에 라인은 못찾겠네요
3-2) image가 왼쪽에는 색상이 있고 오른쪽에 가서 흰색(배경색)으로 바뀐다면?
==> 왼쪽 외각선은 찾겠지만 오른쪽 외각선은 못찾을것 같으데요..
색상이 흰색에서 검은색이든 , 검은색에서 흰색이든 변화하는 부분을 모두 찾아야 할것 같은데요...
4. 또하나 맨마지막 while문안에 검은색인지 흰색인지 비교구문( if 문 ) 에서
|| 가 아니라 && 로 바뀌어야 할것 같은데요
셋중에 하나만 255 인경우가 아니라 grb값 셋 모두 255 이어야 흰색이구
셋다 0 이어야 검은색이니까요...
그럼 즐플하세요
정구일 님이 쓰신 글 :
: 안녕하세요.
: 비트맵 파일 외각선 추출에 관해서 질문이 있어서 이렇게 질문드립니다.
: 비트맵 파일을 불러와서 외각선을 추출해야 합니다.
: 그래서 bmp 파일 rgb 값을 사용하여 외각선을 추출하려고 합니다.
: 방법은 우선 배경은 하얀색이라는 가정을 두고 시작했습니다.
: 배경이 하얀색이기 때문에 하얀색 이외의 색은 모두 검은색으로 만듭니다.
: 그리고 rgb 값을 읽어 하얀색 rgb 값 다음 rgb 값이 검은색이면
: 그 곳이 경계선이 되게 했습니다.
: 그런데 약간의 문제가 있는지 생각 처럼 잘 되지 않습니다.
: 무엇이 잘 못 되었는지 봐주시면 감사하겠습니다.
:
: /*
: 비트맵 파일 이미지를 불러와서 그 이미지에 외각선을 추출한다.
: 그 이미지에 배경색은 하얀색이다.
: */
:
: #include <stdio.h>
:
: #define BYTE unsigned char
: #define MAX 1000 // 비트맵에 크기를 자동으로 계산 하는 방법을 모르겠습니다.
:
: struct BMP_DATA // 비트맵 RGB값
: {
: BYTE r;
: BYTE g;
: BYTE b;
: };
:
: void main()
: {
: static struct BMP_DATA rgb[MAX];
: int i = 0;
: FILE *fp;
: fp = fopen ("test.bmp", "w");
:
: while (i < MAX) // 비트맵 배경이 하얀색이지만 완전 하얀색이 아닐수 있으므로 완전 하얀색을 만든다.
: {
: if (rgb[i].r > 220)
: {
: rgb[i].r = 255;
: }
: if (rgb[i].g > 220)
: {
: rgb[i].g = 255;
: }
: if (rgb[i].b > 220)
: {
: rgb[i].b = 255;
: }
: i++;
: }
:
: while (i < MAX) // 배경이 아니라면 검은색으로 바꾼다.
: {
: if (rgb[i].r != 255)
: {
: rgb[i].r = 0;
: }
: if (rgb[i].g != 255)
: {
: rgb[i].g = 0;
: }
: if (rgb[i].b != 255)
: {
: rgb[i].b = 0;
: }
: i++;
: }
:
: while (i < MAX) // 하얀색 다음 검은색이라면 그 곳이 경계 이므로 색을 바꾼다.
: {
: if (rgb[i].r == 255 || rgb[i].g == 255 || rgb[i].b == 255)
: {
: if (rgb[i+1].r == 0 || rgb[i+1].g == 0 || rgb[i+1].b == 0)
: {
: rgb[i].r = 100;
: rgb[i].g = 100;
: rgb[i].b = 100;
: }
: }
: i++;
: }
: fclose(fp);
: }
|