C언어에서 .bmp 파일의 각 픽셀 당 색깔의 값 구하기

corone의 이미지

C언어로요

.bmp파일(혹은 이미지 파일 아무거나 .jpg .gif 등등) 불러와서
특정 픽셀의 색깔의 값(혹은 코드)을 알려면 어떻게 해야 되요?

한 픽셀은 하나의 색을 갖고 있잖아요

맞나요?

그리고 색깔은 모두 색깔코드값을 갖고 있고

16진수 6자리 (RGB코드로)

예를 들어서 C언어에서 400x300 크기의 .bmp 파일을 불러와서
가로 120픽셀, 세로 20픽셀 위치에 있는 하나의 픽셀의 색깔 코드값을 물으면
#FF0000 등의 어떤 색깔값을 얻을 수 있는 방법 좀 알려주세요

cococo의 이미지

인터넷에서 BMP 구조 파일 찾아보시면, 아주 간단하게 되 있어서 금방 만드실 수 있을 겁니다.
젤 처음 부분에 여러가지 헤더 정보(비트 수, 파일 크기 등..) 있고, 그 다음에 바로 픽셀의 1차원 배열에 해당하는 RGB 정보가 나오기 땜에, [헤더 크기 + 픽셀 위치 ]하면 바로 색깔 값 나옵니다.
근데, BMP이외의 파일은 잘 모르겠네요.

행복은 희생없이는 얻을 수 없는 것인가?
시대는 불행없이는 넘을 수 없는 것인가?

정태영의 이미지

BMP 는 bottom-up 구조이기 때문에 (width*height-y*width+x)*channels 위치로 해야할거에요.

그리고 256 indexed color 인 경우엔 256 개의 팔레트를 미리 읽어서 테이블에 저장한 뒤에 그 테이블을 참조해서 값을 읽어내야하구요 ;)

bmp 이외에 jpeg, png 등은 libjpeg, libpng 를 이용하면 되지만 인터페이스가 통합되어 있지 않습니다.

그럴 경우 libgd 를 이용하면 png, jpeg, gif 등은 동일한 인터페이스를 통해 접근이 가능해집니다.

--
오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

bushi의 이미지

top-down, bottom-up 혼재되어 있습니다. 헤더에서 height 정보를 읽었을 때 양수로 나오냐 음수로 나오냐의 차이입니다.

그리고, 실제 image width 와는 상관없이 pixel data 의 width 는 항상 4의 배수로 정렬됩니다.

OTL

정태영의 이미지

이전 질문글에서 답변해드렸듯이 openCV 를 이용하면 원하시는 걸 간단히 구현할 수 있습니다.

그 글에 왜 더 이상이 답변이 안달렸나 생각해보시기 바랍니다. 문서는 이유 없이 존재하는게 아닙니다.

http://opencvlibrary.sourceforge.net/

--
오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

corone의 이미지

임베디드 프로그래밍을 하는데
openCV를 설치할까요?? ㅋ
모든 프로그래밍이 데스크탑에서 이루어지는 것은 아니죠
문서는 이유없이 존재하는 것이 아니군요 ㅋ
그런데 그 문서를 왜 더이상 이용할 수 없었는지를 생각해 보시기 바랍니다.

다른 분 답변의 도움으로 bmp파일이 간단한 헤더와 색깔 데이터의 나열로 간단히 구성되어 있다는 것을 알았습니다.
이렇게 간단한 bmp파일을 읽고 쓰는데 소스 한줄이면 될 것입니다.
닭 잡는데 도끼를 쓸까요? 게다가 도끼를 휘두를 수도 없는 좁은 닭장속에서요.
제가 원한 것은 bmp파일의 구조였습니다

어쨌든 그래도 답변 감사드리고
신경써 주셔서 감사드립니다

정태영의 이미지

openCV 는 linux 용 버젼도 있으며 당연히 ARM 에서도 돌아갑니다. 모든 프로그래밍이 데스크탑에서 이루어지는 것은 아니지만 embedded 분야에서도 openCV 를 활용할 수 있으며, 실제 활용하는 경우가 꽤 있는 걸로 알고 있습니다.

그리고 저 위로 스크롤해서 보시면 원하셨던건 bmp 의 구조가 아니라 gif, jpeg 등의 이미지 파일에서 픽셀값을 얻어오는 방법이라고 하셨습니다. 이 경우 libgif, libjpeg, linpng 등을 사용하는 방법도 있겠지만 하나하나에 대한 사용법이 아주 간단한 편도 아니고 (해당 포멧에 대한 지식이 필요합니다.) 저걸 추상화 해놓은 또다른 API 셋을 포함한 라이브러리로 생각난게 openCV 였습니다. libgd 등도 있지만 gd 는 bmp 를 지원하지 않구요.

추가로 얘기드리자면 bmp 의 경우 대게 bmpfileheader / bmpinfoheader / pallete(optional) / data 순서로 들어있지만 RLE(Run Length Encoding) 등 압축기법이 사용될 수 있기 때문에 언제나 간단한 헤더와 색깔 데이터의 나열로만 이루어지는 것은 아닙니다.

또한 색상 데이타도 256 indexed color 냐 16/24/32bit color 냐에 따라 다르게 처리를 해야하기 때문에 한줄로 (뭐 물론 줄바꿈을 안하고 주루룩 나열한다면 모르겠지만) 구현할 수 없구요.

참고로 답글을 달 당시엔 이 글만을 본 것이 아니고 비슷한 시기에 쓰여졌던 이미지 파일 포멧에 대한 질문도 같이 봤기 때문에 그런 답변을 달아드렸던 것이구요.

약간 기분나쁘셨을수도 있으셨겠지만 나름대로 검색해서 써놓은 링크들은 하나도 살펴보지 않고, 그냥 추가로 질문을 하는 것 같아서 더 저런 답변을 달았었던 것 같습니다.

뭐 하여튼 기분 나쁘셨다면 죄송합니다.

--
오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

익명 사용자의 이미지

ㅋㅋ

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.