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/pixelfor 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.
struct jpeg_decompress_struct {
jpeg_common_fields; /* Fields shared with jpeg_compress_struct */
/* Source of compressed data */
struct jpeg_source_mgr * src;
/* Basic description of image --- filled in by jpeg_read_header(). */
/* Application may inspect these values to decide how to process image. */
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 jpeg_color_space; /* colorspace of JPEG image */
/* image_width는 폭 image_height는 높이 그리고 num_components는 몇개의 색상이 있는지를 알려준다. * jpeg는 각 element당 8bit씩을 사용하고, RGB는 각 8bit * 3 = 24bits * Grayscale은 8bit * 1(단일색상) = 8bits 이런식으로 color depth를 계산하면 된다. */
/* Decompression processing parameters --- these fields must be set before
* calling jpeg_start_decompress(). Note that jpeg_read_header() initializes
* them to default values.
*/
J_COLOR_SPACE out_color_space; /* colorspace for output */ /* 윈도우에서 색대표라고 나오는 것이다. 출력시의 색상계를 의미함 */
unsigned int scale_num, scale_denom; /* fraction by which to scale image */
double output_gamma; /* image gamma wanted in output */
boolean quantize_colors; /* TRUE=colormapped output wanted */
/* the following are ignored if not quantize_colors: */
J_DITHER_MODE dither_mode; /* type of color dithering to use */
boolean two_pass_quantize; /* TRUE=use two-pass color quantization */
int desired_number_of_colors; /* max # colors to use in created colormap */
/* these are significant only in buffered-image mode: */
boolean enable_1pass_quant; /* enable future use of 1-pass quantizer */
boolean enable_external_quant;/* enable future use of external colormap */
boolean enable_2pass_quant; /* enable future use of 2-pass quantizer */
/* Description of actual output image that will be returned to application.
* These fields are computed by jpeg_start_decompress().
* You can also use jpeg_calc_output_dimensions() to determine these values
* in advance of calling jpeg_start_decompress().
*/
JDIMENSION output_width; /* scaled image width */
JDIMENSION output_height; /* scaled image height */
int out_color_components; /* # of color components in out_color_space */
int output_components; /* # of color components returned */
/* output_components is 1 (a colormap index) when quantizing colors;
* otherwise it equals out_color_components.
*/
int rec_outbuf_height; /* min recommended height of scanline buffer */
/* If the buffer passed to jpeg_read_scanlines() is less than this many rows
* high, space and time will be wasted due to unnecessary data copying.
* Usually rec_outbuf_height will be 1 or 2, at most 4.
*/
/* When quantizing colors, the output colormap is described by these fields.
* The application can supply a colormap by setting colormap non-NULL before
* calling jpeg_start_decompress; otherwise a colormap is created during
* jpeg_start_decompress or jpeg_start_output.
* The map has out_color_components rows and actual_number_of_colors columns.
*/
int actual_number_of_colors; /* number of entries in use */
JSAMPARRAY colormap; /* The color map as a 2-D pixel array */
/* State variables: these variables indicate the progress of decompression.
* The application may examine these but must not modify them.
*/
/* Row index of next scanline to be read from jpeg_read_scanlines().
* Application may use this to control its processing loop, e.g.,
* "while (output_scanline < output_height)".
*/
JDIMENSION output_scanline; /* 0 .. output_height-1 */
/* Current input scan number and number of iMCU rows completed in scan.
* These indicate the progress of the decompressor input side.
*/
int input_scan_number; /* Number of SOS markers seen so far */
JDIMENSION input_iMCU_row; /* Number of iMCU rows completed */
/* The "output scan number" is the notional scan being displayed by the
* output side. The decompressor will not allow output scan/row number
* to get ahead of input scan/row, but it can fall arbitrarily far behind.
*/
int output_scan_number; /* Nominal scan number being displayed */
JDIMENSION output_iMCU_row; /* Number of iMCU rows read */
/* Current progression status. coef_bits[c][i] indicates the precision
* with which component c's DCT coefficient i (in zigzag order) is known.
* It is -1 when no data has yet been received, otherwise it is the point
* transform (shift) value for the most recent scan of the coefficient
* (thus, 0 at completion of the progression).
* This pointer is NULL when reading a non-progressive file.
*/
int (*coef_bits)[DCTSIZE2]; /* -1 or current Al value for each coef */
/* Internal JPEG parameters --- the application usually need not look at
* these fields. Note that the decompressor output side may not use
* any parameters that can change between scans.
*/
/* Quantization and Huffman tables are carried forward across input
* datastreams when processing abbreviated JPEG datastreams.
*/
JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS];
/* ptrs to coefficient quantization tables, or NULL if not defined */
JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS];
JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS];
/* ptrs to Huffman coding tables, or NULL if not defined */
/* These parameters are never carried across datastreams, since they
* are given in SOF/SOS markers or defined to be reset by SOI.
*/
int data_precision; /* bits of precision in image data */
jpeg_component_info * comp_info;
/* comp_info[i] describes component that appears i'th in SOF */
UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */
UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */
UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */
unsigned int restart_interval; /* MCUs per restart interval, or 0 for no restart */
/* These fields record data obtained from optional markers recognized by
* the JPEG library.
*/
boolean saw_JFIF_marker; /* TRUE iff a JFIF APP0 marker was found */
/* Data copied from JFIF marker; only valid if saw_JFIF_marker is TRUE: */
UINT8 JFIF_major_version; /* JFIF version number */
UINT8 JFIF_minor_version;
UINT8 density_unit; /* JFIF code for pixel size units */
UINT16 X_density; /* Horizontal pixel density */
UINT16 Y_density; /* Vertical pixel density */
boolean saw_Adobe_marker; /* TRUE iff an Adobe APP14 marker was found */
UINT8 Adobe_transform; /* Color transform code from Adobe marker */ /* X_density, Y_density는 DPI 단위의 수평,수직 해상도를 나타낸다. */
boolean CCIR601_sampling; /* TRUE=first samples are cosited */
/* Aside from the specific data retained from APPn markers known to the
* library, the uninterpreted contents of any or all APPn and COM markers
* can be saved in a list for examination by the application.
*/
jpeg_saved_marker_ptr marker_list; /* Head of list of saved markers */
/* Remaining fields are known throughout decompressor, but generally
* should not be touched by a surrounding application.
*/
/*
* These fields are computed during decompression startup
*/
int max_h_samp_factor; /* largest h_samp_factor */
int max_v_samp_factor; /* largest v_samp_factor */
int min_DCT_scaled_size; /* smallest DCT_scaled_size of any component */
JDIMENSION total_iMCU_rows; /* # of iMCU rows in image */
/* The coefficient controller's input and output progress is measured in
* units of "iMCU" (interleaved MCU) rows. These are the same as MCU rows
* in fully interleaved JPEG scans, but are used whether the scan is
* interleaved or not. We define an iMCU row as v_samp_factor DCT block
* rows of each component. Therefore, the IDCT output contains
* v_samp_factor*DCT_scaled_size sample rows of a component per iMCU row.
*/
JSAMPLE * sample_range_limit; /* table for fast range-limiting */
/*
* These fields are valid during any one scan.
* They describe the components and MCUs actually appearing in the scan.
* Note that the decompressor output side must not use these fields.
*/
int comps_in_scan; /* # of JPEG components in this scan */
jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN];
/* *cur_comp_info[i] describes component that appears i'th in SOS */
JDIMENSION MCUs_per_row; /* # of MCUs across the image */
JDIMENSION MCU_rows_in_scan; /* # of MCU rows in the image */
int blocks_in_MCU; /* # of DCT blocks per MCU */
int MCU_membership[D_MAX_BLOCKS_IN_MCU];
/* MCU_membership[i] is index in cur_comp_info of component owning */
/* i'th block in an MCU */
int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */
/* This field is shared between entropy decoder and marker parser.
* It is either zero or the code of a JPEG marker that has been
* read from the data source, but has not yet been processed.
*/
int unread_marker;
이용약관 개정과 관련하여 문의사항은 싸이월드 헬프데스크로 접수해 주시기 바라며
개정약관에 동의하지 않을 경우, 개정 공지일인 2009년 5월 12일부터 6월 14일까지 거부의사를 표시할 수 있습니다. 만약 해당 기간 내에 거부의사를 표시하지 않으면
본 개정약관에 동의하신 것으로 간주됩니다.
그런데.. 동의하지 않고 거부의사를 표시할 수 있다고 하는데 표시만 하면 땡?
사용자 입장에서는 거부의사 안하면 동의하신것으로 간주하는게 편하긴 하지만
거부의사를 표시할 수 있다고 해서 기존 약관으로 돌아 갈 수 있는건지
어떠한 내용도 없이, 헬프데스크에 거부하셈~ 라고 하는 이 내용은 도대체 어떻게 받아 들여야 하는걸까?
$ dos2unix --help
dos2unix Copyright (c) 1994-1995 Benjamin Lin
Copyright (c) 1998 Bernd Johannes Wuebben (Version 3.0)
Copyright (c) 1998 Christian Wurll (Version 3.1)
Usage: dos2unix [-hkqV] [-c convmode] [-o file ...] [-n infile outfile ...]
-h --help give this help
-k --keepdate keep output file date
-q --quiet quiet mode, suppress all warnings
always on in stdin->stdout mode
-V --version display version number
-c --convmode conversion mode
convmode ASCII, 7bit, ISO, Mac, default to ASCII
-l --newline add additional newline in all but Mac convmode
-o --oldfile write to old file
file ... files to convert in old file mode
-n --newfile write to new file
infile original file in new file mode
outfile output file in new file mode
라는 것이다.
지금 작성하던 부분을 계속 잡고 늘어 져서 끝까지 고칠 것인지,
아니면 그것을 버리고 새로 작성할 것인지,
그리고 그것을 어떻게 재사용을 할 것인지, 이러한 부분들이 가장 어렵고 힘들다.
간단하게 대답하자면, 결국은 선택의 문제이지만,
글쎄.. 잡고 있었던 시간 만큼 쉽게 놓지 못하는건 미련에 아쉬움이고
이를 떨쳐내고 더욱 빠르게 원하는 시간내에 새로 만들수 있음에도 불구하고
그 아쉬움에 묶여 있는 것은, '무'로 돌릴 용기가 없기 때문이다.
물론 '무'는 아무것도 없는 것이 아니다.
그 문제를 해결하려 하면서 습득한 정보들로 인해서 아주 조금이라도 늘었으니 말이다.
그래도 그러한 무형의 증가보다
눈에 보이는 코드의 길이가 0으로 된다는 것은 쉽지 않은 결정이다.
나의 개발 방법은 다음과 같다.
1. 최소한의 입력과 출력을 정한다.
- 함수는 black box로 입력과 출력을 가지고, 내부 작동은 타인이 모르도록 한다
- 객체지향개념으로 봐도 무관하려나?
2. 사용가능한 이미 제작된 함수가 있는지 살펴보라
- 내가 만드는게 빠르다고 생각될지 몰라도,
디버깅에 필요한 시간을 따지면 이미 작성된 안정된 소스를 사용하는것이 유리하다
- 그렇다고 그 함수가 너무 복잡하다면 차라리 자체 제작을 해서 최적화 시키는것이 낫다.
3. 원본 데이터는 되도록이면 손상시키지 않는다.
- 요즘 시스템은 거의 대부분 메모리가 남아 돈다. 굳이 메모리를 아끼기 위해 cpu를 쓸필요는 없다.
- 원본 데이터는 말그대로 원본이므로 원본을 유지해준다. 함수에서는 내부적으로 사본을 만들어 조작한다.
4. 함수가 커지면 함수를 조각내서 그것을 감싸는 함수를 만든다.
- refactoring이라고 하던가?
- 단일 기능을 가지는 함수들을 조합해서 더욱 큰 기능을 구현해 낼수 있고 이는 유닉스의 'simple is beautiful' 철학이다.
5. 주석을 남긴다. 하지만 그렇다고 남발하지 말 것.
- 주석이 있으면 나중에 보기는 편하지만, 솔찍히 주석으로 보는것 보다는 너무 복잡하지 않다면 코드가 더 이해가 잘된다.
- 주석을 위한 주석보다는 정말 이해하기 힘든부분에만 주석을 남긴다.
- 주석을 남길정도가 된다면 함수로 분리를 한다. 함수 이름을 기능으로 나타내는게 더 알아 보기 쉽고 재사용에 유리하다
6. 주석을 남기고 싶다면 차라리 별도 문서로 작성하라.
- 주석을 남겨야 할 정도로 복잡하다면 이미 주석으로 남기기에는 2% 부족하다.
- 이러한 부분은 차라리 독립된 문서로 ppt나 doc 혹은 pdf로 별도 문서로 작성한다. (다음 사람을 위해)