install.txt 파일에 다음의 내용이 있었다. (역시 설명서는 잘 읽어야 해..)

Microsoft Windows, Microsoft Visual C++ 6 Developer Studio:

We include makefiles that should work as project files in DevStudio 6.0 or later.
There is a library makefile that builds the IJG library as a static Win32 library,
and application makefiles that build the sample applications as Win32 console applications.
(Even if you only want the library, we recommend building the applications so that you can run the self-test.)

To use:
1. Copy
jconfig.vc to jconfig.h
makeadsw.vc6 to apps.dsw
makecdep.vc6 to cjpeg.dep
makecdsp.vc6 to cjpeg.dsp
makecmak.vc6 to cjpeg.mak
makeddep.vc6 to djpeg.dep
makeddsp.vc6 to djpeg.dsp
makedmak.vc6 to djpeg.mak
makejdep.vc6 to jpeg.dep
makejdsp.vc6 to jpeg.dsp
makejdsw.vc6 to jpeg.dsw
makejmak.vc6 to jpeg.mak
makerdep.vc6 to rdjpgcom.dep
makerdsp.vc6 to rdjpgcom.dsp
makermak.vc6 to rdjpgcom.mak
maketdep.vc6 to jpegtran.dep
maketdsp.vc6 to jpegtran.dsp
maketmak.vc6 to jpegtran.mak
makewdep.vc6 to wrjpgcom.dep
makewdsp.vc6 to wrjpgcom.dsp
makewmak.vc6 to wrjpgcom.mak
(Note that the renaming is critical!)

2. Click on jpeg.dsw and apps.dsw to load the project workspaces.
   (If you are using DevStudio more recent than 6.0, you'll probably
   get a message saying that the project files are being updated.)

3. Build the library project, then the applications project.

4. Move the application .exe files from `app`\Release to an appropriate location on your path.

5. To perform the self-test, execute the command line
    NMAKE /f makefile.vc  test



2단계에서 dsw 파일 읽어 오는것은 실패했다.. OTL
아무튼 5단계의 nmake를 이용하면 컴파일까지 완료된다.


Microsoft Windows, Microsoft Visual C++ 2008 Developer Studio (v9):

We include makefiles that should work as project files in Visual Studio 2008 or later.
There is a library makefile that builds the IJG library as a static Win32 library,
and application makefiles that build the sample applications as Win32 console applications.
(Even if you only want the library, we recommend building the applications so that you can run the self-test.)

To use:
1. Copy
jconfig.vc to jconfig.h
makeasln.vc9 to apps.sln
makecvcp.vc9 to cjpeg.vcproj
makedvcp.vc9 to djpeg.vcproj
makejsln.vc9 to jpeg.sln
makejvcp.vc9 to jpeg.vcproj
makervcp.vc9 to rdjpgcom.vcproj
maketvcp.vc9 to jpegtran.vcproj
makewvcp.vc9 to wrjpgcom.vcproj
(Note that the renaming is critical!)

2. Click on jpeg.sln and apps.sln to load the project solutions.
   (If you are using Visual Studio more recent than 2008 (v9), you'll
   probably get a message saying that the project files are being updated.)

3. Build the library project, then the applications project.

4. Move the application .exe files from `app`\Release to an appropriate location on your path.

5. To perform the self-test, execute the command line
    NMAKE /f makefile.vc  test

신고
Posted by 구차니

댓글을 달아 주세요

  1. 오~ 감사한 포스팅이라능!
    좀 해보고나서 결과를 말씀드리겠다능!

    2009.09.01 21:24 신고 [ ADDR : EDIT/ DEL : REPLY ]
  2. 저는 최근 하루에 한개 포스팅도 힘들어 죽겠는데 구차니님은 소나기 포스트~

    2009.09.01 23:22 신고 [ ADDR : EDIT/ DEL : REPLY ]

jpeg는 grayscale일 경우에는 무조건 흑백인 듯 하다.
(조금 더 확실하게 검색필요)

그런 이유로, 8bit color일 경우에는 팔레트가 NULL인지 아닌지 확인하고
NULL일 경우에는 팔레트를 만들어주면 된다.

wrbmp.c 파일을 참고 하자면
LOCAL(void)
write_colormap (j_decompress_ptr cinfo, bmp_dest_ptr dest,
		int map_colors, int map_entry_size)
{
  JSAMPARRAY colormap = cinfo->colormap;
  int num_colors = cinfo->actual_number_of_colors;
  FILE * outfile = dest->pub.output_file;
  int i;

  if (colormap != NULL) {
    if (cinfo->out_color_components == 3) {
      /* Normal case with RGB colormap */
      for (i = 0; i < num_colors; i++) {
	putc(GETJSAMPLE(colormap[2][i]), outfile);
	putc(GETJSAMPLE(colormap[1][i]), outfile);
	putc(GETJSAMPLE(colormap[0][i]), outfile);
	if (map_entry_size == 4)
	  putc(0, outfile);
      }
    } else {
      /* Grayscale colormap (only happens with grayscale quantization) */
      for (i = 0; i < num_colors; i++) {
	putc(GETJSAMPLE(colormap[0][i]), outfile);
	putc(GETJSAMPLE(colormap[0][i]), outfile);
	putc(GETJSAMPLE(colormap[0][i]), outfile);
	if (map_entry_size == 4)
	  putc(0, outfile);
      }
    }
  } else {
    /* If no colormap, must be grayscale data.  Generate a linear "map". */
    for (i = 0; i < 256; i++) {
      putc(i, outfile);
      putc(i, outfile);
      putc(i, outfile);
      if (map_entry_size == 4)
	putc(0, outfile);
    }
  }
  /* Pad colormap with zeros to ensure specified number of colormap entries */ 
  if (i > map_colors)
    ERREXIT1(cinfo, JERR_TOO_MANY_COLORS, i);
for (; i < map_colors; i++) { putc(0, outfile); putc(0, outfile); putc(0, outfile); if (map_entry_size == 4) putc(0, outfile);
}
}

이런식으로 0에서 255 까지 팔레트를 생성하면 되고,
256color(=8bit) 일 경우에는 팔레트는 RGBQUAD 로 4바이트 구조이므로,
마지막 바이트는 reserve(혹은 alpha) 값으로 0x00(stfae에서는0x80) 을 해주면 된다.
신고
Posted by 구차니

댓글을 달아 주세요

일단 해보니..
struct jpeg_decompress_struct 에
quantize_colors 항목을 TRUE로 설정해주면
colormap 에 팔레트가 생성이되고,
actual_number_of_colors 에는 실제 사용한 색상수 출력이 된다고 하는데..

팔레트가 어떻게 되는지 libjpeg.doc에 제대로 나와있지 않다..
아래의 링크를 조금은 유심히 보고 수정요망

After this call, the final output image dimensions, including any requested
scaling, are available in the JPEG object; so is the selected colormap, if
colormapped output has been requested.  Useful fields include

    output_width        image width and height, as scaled
    output_height
    out_color_components    # of color components in out_color_space
    output_components    # of color components returned per pixel
    colormap        the selected colormap, if any
    actual_number_of_colors        number of entries in colormap

output_components is 1 (a colormap index) when quantizing colors; otherwise it
equals out_color_components.  It is the number of JSAMPLE values that will be
emitted per pixel in the output arrays.

Typically you will need to allocate data buffers to hold the incoming image.
You will need output_width * output_components JSAMPLEs per scanline in your
output buffer, and a total of output_height scanlines will be returned.

Note: if you are using the JPEG library's internal memory manager to allocate
data buffers (as djpeg does), then the manager's protocol requires that you
request large buffers *before* calling jpeg_start_decompress().  This is a
little tricky since the output_XXX fields are not normally valid then.  You
can make them valid by calling jpeg_calc_output_dimensions() after setting the
relevant parameters (scaling, output color space, and quantization flag).

...

The decompression parameters that determine the basic properties of the
returned image are:

J_COLOR_SPACE out_color_space
    Output color space.  jpeg_read_header() sets an appropriate default
    based on jpeg_color_space; typically it will be RGB or grayscale.
    The application can change this field to request output in a different
    colorspace.  For example, set it to JCS_GRAYSCALE to get grayscale
    output from a color file.  (This is useful for previewing: grayscale
    output is faster than full color since the color components need not
    be processed.)  Note that not all possible color space transforms are
    currently implemented; you may need to extend jdcolor.c if you want an
    unusual conversion.

...

boolean quantize_colors
    If set TRUE, colormapped output will be delivered.  Default is FALSE,
    meaning that full-color output will be delivered.

...

When quantize_colors is TRUE, the target color map is described by the next
two fields.  colormap is set to NULL by jpeg_read_header().  The application
can supply a color map by setting colormap non-NULL and setting
actual_number_of_colors to the map size.  Otherwise, jpeg_start_decompress()
selects a suitable color map and sets these two fields itself.
[Implementation restriction: at present, an externally supplied colormap is
only accepted for 3-component output color spaces.]

JSAMPARRAY colormap
    The color map, represented as a 2-D pixel array of out_color_components
    rows and actual_number_of_colors columns.  Ignored if not quantizing.
    CAUTION: if the JPEG library creates its own colormap, the storage
    pointed to by this field is released by jpeg_finish_decompress().
    Copy the colormap somewhere else first, if you want to save it.

int actual_number_of_colors
    The number of colors in the color map.

...

int out_color_components    Number of color components in out_color_space.
int output_components        Number of color components returned.

[출처 : libjpeg.doc]





[링크 : http://svn.neurostechnology.com/filedetails.php]
[링크 : http://www.koders.com/c/fid95CCE6190079AB3FDDE3C71309BA75EB5BA943FC.aspx]
신고
Posted by 구차니

댓글을 달아 주세요

  1. 그저 헷갈릴 땐 조용히 CxImage에서 wrapping한 거 스브적 사용 크리~

    2009.07.11 10:55 신고 [ ADDR : EDIT/ DEL : REPLY ]

- 조금 더 조사해보고 다시 써야함 -

libjpeg를 이용하여 jpeg를 변환하는데 다른건 잘되길래
테스트 하기위해 gimp에서 grayscale로 변환하였고, 데이터 상으로는 8bit 이미지로 출력이 되었다.
막상 화면에 뿌리려고 보니 기본 루틴이 24bit라서 이상하게 나오는데,
나오는 모습을 보니 묘하다고 해야 하나.. 아무튼 grayscale이니 1byte 단위로  gray만 출력하는 것으로 보인다.

그런데.. 흑백 bitmap은 구조가 어떻게 되려나?


jpg(좌) bmp(우)


회색 이미지는 GIMP에서 jpg를 grayscale로 변환후, bmp로 저장한 것이다.
이 파일 내용을 보니, 헤더 다음에 위와 같이 000 111 222 이런 식으로 반복되는 것이 있는데,
bitmap은 별도의  grayscale이 존재하는 것이 아니라, 256 indexed color로 저장이되며, 결국 "팔레트로 표현"이 된다.

신고
Posted by 구차니

댓글을 달아 주세요

libjpeg는 말그대로 jpeg을 위한 라이브러리이다.

이 녀석으로 할 수 있는 것은,
일정 사이즈로 resize(리사이즈) 혹은 scale/scaling(스케일링) 하는 것과
jpg를 bmp로 변환하는 것이다. djpeg를 보면 다른 bmp 포맷으로도 변환이 가능하지만,
윈도우 기반의 Bitmap으로만 할줄을 알아서..(헤더만 차이가 있을려나..)

아무튼 자세한 내용은 libjpeg에 들어있는 libjpeg.doc 을 참조 하면 되지만
한가지 애매한 부분이 있어 추가를 한다.

jpeg_read_header(&cinfo, TRUE);

이부분은 말그대로 jpeg 파일의 크기등의 각종 정보를 불러온다.
그리고 그 정보를 바탕으로 scaling을 준비한다. 그리고 나서

jpeg_start_decompress(&cinfo);

위의 함수를 호출하여(정확하게는 매크로) jpeg 을 bitmap으로 변환한다.
아래는 변환 부분의 소스코드이며,

cinfo.scale_num = 1;
cinfo.scale_denom = 8;

부분의 값으로 인해서 1/8 크기로 축소되어 변형된다.
(이로인해 preview 시에 상당히 빠르게 볼 수 있다. 그리고 jpeg6b 버전의 최대값이 1/8 이다)
	struct jpeg_decompress_struct cinfo;
	struct jpeg_error_mgr jerr;
	FILE * infile;
	unsigned char *data_ori = NULL;
	unsigned char *data = NULL;
	int		calc_width;

	cinfo.err = jpeg_std_error(&jerr);
	jpeg_create_decompress(&cinfo);
		jpeg_stdio_src(&cinfo, infile);
		jpeg_read_header(&cinfo, TRUE);
			cinfo.scale_num = 1;
			cinfo.scale_denom = 8;
		jpeg_start_decompress(&cinfo);
			calc_width = (cinfo.output_width * cinfo.jpeg_color_space + 3) / 4 * 4;
			data = data_ori = malloc(calc_width * cinfo.output_height);
			if(data == NULL)
			{
				jpeg_finish_decompress(&cinfo);
				jpeg_destroy_compress(&cinfo);

				fclose(infile);
				return FALSE;
			}

		while (cinfo.output_scanline < cinfo.output_height)
		{
			jpeg_read_scanlines(&cinfo, &data, 1);
			data += calc_width;
		}

		jpeg_finish_decompress(&cinfo);
	jpeg_destroy_compress(&cinfo);

fclose(infile); free(data_ori);

calc_width = (cinfo.output_width * cinfo.jpeg_color_space + 3) / 4 * 4;

이 부분은 bitmap특성상 4byte align이 되어야 하므로, 4바이트 단위로 끊어주는 계산을 해준다.
아래의 data += calc_width; 에서 사용된다.
신고
Posted by 구차니

댓글을 달아 주세요

  1. 비밀댓글입니다

    2009.09.02 04:21 [ ADDR : EDIT/ DEL : REPLY ]
    • 쓰는것에 대한 예제는 cjpeg 입니다(compress - jpeg)
      jpeg를 읽어서 변환하는건 transjpeg 였나 그렇구요 bmp나 다른 포맷으로 빼내는건 djpeg(decompress - jpeg) 랍니다.

      음.. 저도 jpeg로 저장을 해보려다가 GG 쳐서 말이죠 ㅋ

      2009.09.02 09:29 신고 [ ADDR : EDIT/ DEL ]
  2. 비밀댓글입니다

    2009.09.02 06:13 [ ADDR : EDIT/ DEL : REPLY ]
    • 아마 CxImage가 C++ Class 기반이 되면서 조금 더 느려진게 아닐까라고 추측을 해봅니다. 음.. 저도 6b로 했었는데 금세 7이 나왔나보네요? ^^;

      2009.09.02 09:30 신고 [ ADDR : EDIT/ DEL ]
    • 아.. 반대로 이해했군요 -ㅁ-
      음.. CxImage가 더 빠르다면 자체적으로 코드옵티마이즈 했거나.. 컴파일러가 더 좋은걸려나요? ㅋ

      2009.09.02 09:44 신고 [ ADDR : EDIT/ DEL ]
    • 음.. 그리고 코드가 많이 다르지 않다면,
      아마 결과물과 입력물의 압축율 기본값 차이라던가,
      scaling의 차이일수도 있고, 여러가지 차이가 있어서 딱히 단정짓기는 힘들어서 말이죠 ^^;

      그리고 6b에서는 output scale factor가 1/2 1/4 1/8 로 제한이 되어 있었던거 같고, 1/8이 가장 빠른 decompressing을 나타낸다고 되어 있었어요

      2009.09.02 12:03 신고 [ ADDR : EDIT/ DEL ]
    • 물론, 옵션의 차이일 수도 있습니다.
      하지만, 아무리 그래도 아무런 손도 대지 않고, 기본 옵션 설정 및 똑같은 압축률만 지정했는데 더 밀린다는 건 좀 우습네요.

      고맙습니다. 덕분에 재미있는 공부 했습니다.

      이거 하나 포스팅할까 했다가, 어디부터 써야 할 지 막막해서 포기. OTL

      2009.09.02 13:14 신고 [ ADDR : EDIT/ DEL ]
    • 음.. 아무튼 Visual sutio project 만드는 건 조금 더 공부를 해봐야겠어요 ㅠ.ㅠ

      2009.09.02 13:21 신고 [ ADDR : EDIT/ DEL ]
  3. 죽 확인해보니 transjpeg는 재압축을 하는 것이 아니라 그냥 압축된 스트림을 통째로 다시 쓰는 놈이더군요. OTL.
    이제 사용법을 거의 알았습니다.

    VC6, VS2009 외의 다른 VS에선 잘 안되는 것 같습니다. 결국 VC6으로만 작업... ㅠ.ㅠ

    2009.09.02 20:15 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • 전 cjpeg djpeg transjpeg 거의 다 포기하고
      자체적으로 만들었답니다 ㅠ.ㅠ dog노가다 ㅠ.ㅠ

      그냥 example.c 가 만세입니다 ㅋㅋ

      2009.09.03 09:27 신고 [ ADDR : EDIT/ DEL ]
    • example.c 만세 올인!

      2009.09.03 21:48 신고 [ ADDR : EDIT/ DEL ]
  4. Saver

    좋은글 잘 보았습니다. 혹시나 질문이 있는데 raw -> jpeg 시에 scale_num, scale_denom이 아무리해도

    안먹히는 것 같은데 혹시 아시는것 있으신가요? 설명서엔 8/N (N=1-16)이라고 되어있는데 어떤 값을 넣어도 반응이 없네요.

    2010.11.14 01:15 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • jpeg->bmp로만 해봐서 raw->jpeg는 아직 못해봤답니다.
      언제 한번 시간내서 해보고 다시 글을 쓰도록 하겠습니다 ^^

      2010.11.14 10:35 신고 [ ADDR : EDIT/ DEL ]
  5. Saver

    아. compress시에 setDefault 다음에 커스텀 파라미터를 줘야 하는 거였네요; [설명서를 다시 한번 잘 읽어보니..]

    그런데 버그가 있는것 같습니다. scale시에 확장은 잘 되는데 축소시에는 무슨 수치를 넣든 가로 세로 1/2씩 밖에 줄지 않네요 -.-; cjpeg 예제를 실행해도 마찬가지인걸 보면 아예 버그인듯..?

    2010.11.14 14:41 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • 그래도 libjpeg은 설명서가 잘 되서 좋은거 같아요 ^^;
      jpeg decoding만 해봐서.. OTL 인코딩은 아직 못했봤다니까요 ㅠ.ㅠ

      2010.11.14 15:14 신고 [ ADDR : EDIT/ DEL ]
  6. 하얀언덕

    안녕하세요 구차니님~~~
    항상 자료 검색하다보면 어느샌가 여기로 이어지내요 ㅋㅋㅋ
    여러가지 찾아 보다가...
    질문 좀 드리려구용 ^^
    libjpeg 쓰면서...
    scale 할때
    cinfo.scale_num = 1;
    cinfo.scale_denom = 8;

    이용하는 것 말고...

    임의의 크기 width, height 2개 입력 받아서 크기를 정하는건 없나요..ㅠ ㅠ
    원래 크기가 600x500 이라하면
    width = 200
    height = 200
    요래요래 바꾸어서 출력할 수 있는지요...
    아... 검색스킬의 환계로 인하여..ㅠ ㅠ
    이렇게 질문을 드립니다용~

    2011.11.22 17:29 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • http://stackoverflow.com/questions/7488048/libjpeg-output-scaling

      검색을 해보니 자체적으로 scaling을 해야 한다고 하네요. bmp로 decoding후 줄여서 다시 encoding 해야할듯 싶어요

      2011.11.22 19:10 신고 [ ADDR : EDIT/ DEL ]

상당히 끙끙대게 하던 녀석인데.. 겨우겨우 해결이 되었다..
해결 방법은 의외로 간단하다.(안해보고 고생 안했으면 말을 하지마세요?!)

1. ./configure --prefix=$(TARGET_ROOT_FS)/usr CC=$(CROSS)-gcc

2. vi Makefile
 38 # If using GNU libtool, LIBTOOL references it; if not, LIBTOOL is empty.^M
 39 LIBTOOL = ./libtool^M
※ libtool은 쉘스크립트로 내용을 수정해야 하므로, 편의상 jpeg-6b 디렉토리에 복사를 하였다.

3. vi libtool
262 # The linker used to build libraries.
263 LD=$(CROSS)-ld
264 #LD="/usr/bin/ld"
※ libtool은 쉘스크립트로 내용을 수정해야 하므로, 복사본을 사용하도록 한다.

stlinux 예제



make install 시에는
$(TARGET_ROOT_FS)/usr/bin 이 존재하지 않으면 에러가 발생하므로 미리 확인하거나
cjpeg / djpeg / jpegtran / rdjpegcom / wrjpegcom 이 필요 없다면 무시해도 된다.

[링크 : http://metastatic.org/text/libtool.html]
신고
Posted by 구차니

댓글을 달아 주세요

/*
 * Ordering of RGB data in scanlines passed to or from the application.
 * If your application wants to deal with data in the order B,G,R, just
 * change these macros.  You can also deal with formats such as R,G,B,X
 * (one extra byte per pixel) by changing RGB_PIXELSIZE.  Note that changing
 * the offsets will also change the order in which colormap data is organized.
 * RESTRICTIONS:
 * 1. The sample applications cjpeg,djpeg do NOT support modified RGB formats.
 * 2. These macros only affect RGB<=>YCbCr color conversion, so they are not
 *    useful if you are using JPEG color spaces other than YCbCr or grayscale.
 * 3. The color quantizer modules will not behave desirably if RGB_PIXELSIZE
 *    is not 3 (they don't understand about dummy color components!).  So you
 *    can't use color quantization if you change that value.
 */
#define RGB_RED		0	/* Offset of Red in an RGB scanline element */
#define RGB_GREEN	1	/* Offset of Green */
#define RGB_BLUE	2	/* Offset of Blue */
#define RGB_PIXELSIZE	3	/* JSAMPLEs per RGB scanline element */

libjpeg를 일반적인 표준 Bitmap 파일에 적용하기 위해서는 (혹은 Blit 함수에)
RGBQUADRGBTRIPLE과 동일한 구조로 나오는 것이 좋다.

typedef struct tagRGBQUAD { 
  BYTE rgbBlue;
  BYTE rgbGreen;
  BYTE rgbRed;
  BYTE rgbReserved;
} RGBQUAD;

typedef struct tagRGBTRIPLE { 
  BYTE rgbtBlue; 
  BYTE rgbtGreen; 
  BYTE rgbtRed;
} RGBTRIPLE;

이런 이유로 설정값을 바꾸지 않고 그냥 libjpeg를 사용하게 되면,
변환후에 RGB를 일일이 순서를 바꾸어 주어야 한다.

제약사항으로는
sample application인 djpeg cjpeg 는 적용이 되지 않고(어짜피 BGR로 표준 bitmap 포맷으로 나온다..)
YCbCr(YUV) <-> RGB 변환에만 적용이 된다는 것(JPEG가 YUV 아닌게 있던가?)
color quantizer는 RGBTIPLE(24bit)만 적용되지 RGBQUAD(32bit)는 적용되지 않는다.

솔찍히 먼소리인지 모르겠고.. 실질적으로 YUV->RGB 변환만 한다면 무시해도 될 듯하다.
신고
Posted by 구차니

댓글을 달아 주세요

unsigned int scale_num, scale_denom
    scale_num/scale_denom 의 분수비로 영상 비율을 조절합니다.
    기본값은 1/1 혹은 조절하지 않음입니다.
    현재, 지원되는 조정 비율은 1/1, 1/2, 1/4, 1/8 입니다.
    (라이브러리 설계는 무제한의 비율이 가능하도록 되어있지만,
    빠른시일내로 적용되기는 힘들것으로 보입니다.)
    작은 조절 비율은 적은 수의 픽셀 연산과 단순화된 IDCT 방법을
    사용 할 수 있기 때문에, 매우 빠른 속도의 변환을 합니다

(scale_num은 분자, scale_denom은 분모입니다.
만약에 1/4로 하려고 한다면 scale_num = 1; scale_denom = 4; 로 하면 될 듯 합니다
- 확인요망)


원문


6. while (scan lines remain to be read)
    jpeg_read_scanlines(...);

jpeg_read_scanlines()을 한번 혹은 여러번 호출함으로서 압축해제 된 영상정보를 읽을 수 있습니다.
각각의 호출시에, 읽을 최대 scanline을 넘겨줍니다
(예를들어, working buffer의 높이); jpeg_read_scanlines() 은
많은 줄들의 값을 돌려줄 것 입니다. 돌려준 값은 실제로 읽은 줄의 갯수입니다.
돌려받은 영상정보의 형태(format)는 위의 "Data formats"에 기술되어 있습니다.
흑백과 색상이 있는 JPEG는 서로 다른 데이터 형태라는 것을 잊지마십시오!

영상정보는 상-하 순서로 주어집니다. 만약에 하-상 순서로 영상정보를 저장해야 한다면,
효과적으로 JPEG 라이브러리의 가상 배열 방식을 사용하여 뒤집을 수 있습니다.
예제 프로그램인 djpeg에서 이러한 사용예를 찾으실 수 있습니다.

원문



Data formats

픽셀들은 scanline 단위로 왼쪽에서 오른쪽 방향으로 저장됩니다
각각의 픽셀을 위한 값들은 열단위로 나란히 있습니다;
24-bit RGB 를 예를 들자면, R,G,B,R,G,B,R,G,B 순서로 되어있습니다.  각각의 scanline은
JSAMPLE 데이터 형의 배열로 되어있습니다 --- jmorecfg.h를 수정하지 않았다면,
일반적으로 "unsigned char" 입니다.  (또한 jmorecfg.h를 수정함으로서
RGB 픽셀의 순서를 B,G,R 순서로 변경할수도 있습니다. 하지만 수정전에 제약사항을
먼저 읽어 보시기 바랍니다.)

원문


신고
Posted by 구차니
TAG libjpeg

댓글을 달아 주세요

int w = cinfo.image_width;
int h = cinfo.image_height;
int d = cinfo.jpeg_color_space;
int out_h = cinfo.output_height;

printf("width:%d height:%d depth:%d out_height:%d\n", w, h ,d, out_h);

unsigned char *data = new unsigned char[w * h * d];
while (cinfo.output_scanline < cinfo.output_height)
{
	jpeg_read_scanlines(&cinfo, &data, 1);
	data += d * cinfo.output_width;
}

jpeg_read_header() 한뒤
jpeg_read_scanline()까지는 알았지만, 문서를 대충 읽다 보니..
도무니 어떻게 메모리를 할당해야 할지 감이 안 잡혔는데..
이 문서를 보니 어떻게 하면 될꺼 같다라는 감이 조금은 온다..
내일 해보고 결과를 적도록 해야겠다.
위에서 대로 전체 할당하고 jpeg_read_scanlines로 읽어 오니 잘된다!

[링크 : http://www.korone.net/bbs/board.php?bo_table=etc_misc&wr_id=168]
신고
Posted by 구차니

댓글을 달아 주세요

  1. 저는 라이브러리를 사용만 해서 이런 고민은 안해봤습니다.

    2009.05.18 10:22 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • 이것도 라이브러리는 맞는데 라이브러리 사용방법이 생각보다 어렵네요 ㅠ.ㅠ 그냥 함수 하나 띡~ 끌어다 쓰면 될줄 알았는데 말이죠

      2009.05.18 10:50 신고 [ ADDR : EDIT/ DEL ]

Subject: [21] What if I need more than 8-bit precision?

Baseline JPEG stores images with 8 bits per color sample, in other words

24 bits per pixel for RGB images
,
8 bits/pixel for grayscale,
32 bits/pixel for CMYK, etc.

There is an extension that stores 12 bits/sample for applications that need higher accuracy.
Medical images, for example, are often 12-bit grayscale.  The 12-bit extension is not very widely supported,
however.  One package that does support it is the free IJG source code (see part 2, item 15).

For lossless JPEG, the standard permits any data precision between 2 and 16 bits per sample,
but high-precision lossless JPEG is even less widely supported than high-precision lossy JPEG.
The Stanford PVRG codec (see part 2, item 15) reportedly supports up to 16 bits/sample for lossless JPEG.

[링크 : http://www.faqs.org/faqs/jpeg-faq/part1/]


jpeg_decompress_struct



struct jpeg_decompress_struct {
  JDIMENSION image_width;    /* nominal image width (from SOF marker) */
  JDIMENSION image_height;    /* nominal image height */
  int num_components;        /* # of color components in JPEG image */
  J_COLOR_SPACE out_color_space; /* colorspace for output */
  UINT16 X_density;        /* Horizontal pixel density */
  UINT16 Y_density;        /* Vertical pixel density */
};

typedef enum {
    JCS_UNKNOWN,        /* error/unspecified */
    JCS_GRAYSCALE,        /* monochrome */
    JCS_RGB,        /* red/green/blue */
    JCS_YCbCr,        /* Y/Cb/Cr (also known as YUV) */
    JCS_CMYK,        /* C/M/Y/K */
    JCS_YCCK        /* Y/Cb/Cr/K */
} J_COLOR_SPACE;

순서는 조금 뒤바뀌지만, 윈도우에서 출력되는 데이터는 위의 6개로 거의 표기가 가능하다.
신고
Posted by 구차니
TAG JPEG, libjpeg

댓글을 달아 주세요

  1. 근데 libjpeg에서 읽으면 메모리에 저장된 놈은 걍 RGB 구조로 만들어주지 않나요?
    jpeg_color_space는 JCS_YCbCr이라도
    out_color_space는 언제나 JCS_RGB인 것 같더군요.

    (표현이 애매하지만, 질문입니다. 이거 딱 하루밖에 안 쓰고 하나 만들었어니 어색... ㅠ.ㅠ)

    2009.09.03 02:33 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • jconfig.h 파일이었던거 같은데..
      거기 보면은 RGB로 할지 BGR로 할지설정이 있고, 기본값은 BGR이었던것으로 기억합니다(jpeg6b 기준)

      그리고 그러한 설정값들은
      jpeg_start_decompress 이전에 jpeg_decompress_struct 구조체에 설정을 해주어야 합니다.

      2009.09.03 09:25 신고 [ ADDR : EDIT/ DEL ]
  2. было полезно прочесть, thanks

    2013.05.14 00:13 신고 [ ADDR : EDIT/ DEL : REPLY ]