JunkBox_Lib  1.10.2
jp2k_tool.c
Go to the documentation of this file.
1 
14 #include "jp2k_tool.h"
15 #include "jbxl_state.h"
16 
17 
18 #ifdef ENABLE_OPENJPEG
19 
20 #if OPENJPEG_VER <= JP2K_VER_15
21 
22 void init_jp2k(JP2KImage* jp)
23 {
24  if (jp==NULL) return;
25  //
26  jp->xs = 0;
27  jp->ys = 0;
28  jp->col = 0;
29  jp->cmode = GRAPH_COLOR_RGBA;
30  jp->state = JBXL_NORMAL;
31  jp->image = NULL;
32 }
33 
34 
35 void free_jp2k(JP2KImage* jp)
36 {
37  if (jp==NULL) return;
38  //
39  if (jp->image!=NULL) {
40  opj_image_destroy(jp->image);
41  }
42  init_jp2k(jp);
43 }
44 
45 
46 void setup_jp2k(JP2KImage* jp)
47 {
48  if (jp==NULL || jp->image==NULL || jp->image->comps==NULL) return;
49  //
50  jp->xs = jp->image->x1 - jp->image->x0;
51  jp->ys = jp->image->y1 - jp->image->y0;
52 
53  int fac = (int)jp->image->comps->factor;
54  jp->ws = (jp->xs + (1<<fac) - 1)>>fac;
55  jp->hs = (jp->ys + (1<<fac) - 1)>>fac;
56 
57  jp->col = (int)jp->image->numcomps;
58  /*
59  if (jp->image->color_space==OPJ_CLRSPC_SRGB) { /// 1
60  jp->col = 3;
61  }
62  else if (jp->image->color_space==OPJ_CLRSPC_GRAY) { /// 2
63  jp->col = 1;
64  }
65  else if (jp->image->color_space==OPJ_CLRSPC_SYCC || jp->image->color_space==OPJ_CLRSPC_EYCC) { /// 3, 4
66  jp->col = 3;
67  }
68  else if (jp->image->color_space==OPJ_CLRSPC_CMYK) { /// 5
69  jp->col = 4;
70  }
71  */
72 
73  // 設定されないものについては,未対応
74  jp->cmode = GRAPH_COLOR_UNKNOWN;
75  int depth = (int)jp->image->comps->bpp;
76  DEBUG_MODE PRINT_MESG("JBXL::JPEG2KIMage::setup_image: INFO: xs = %d, ys = %d, col = %d, depth = %d\n", jp->xs, jp->ys, jp->col, depth);
77  if (depth==0 || depth==8) {
78  if (jp->col==1) jp->cmode = GRAPH_COLOR_GRAY;
79  else if (jp->col==3) jp->cmode = GRAPH_COLOR_RGB;
80  else if (jp->col==4) jp->cmode = GRAPH_COLOR_RGBA;
81  }
82  if (jp->cmode==GRAPH_COLOR_UNKNOWN) {
83  PRINT_MESG("JBXL::JPEG2KIMage::setup_image: unknown color mode: col = %d, depth = %d\n", jp->col, depth);
84  jp->cmode = GRAPH_COLOR_RGBA;
85  }
86 
87 #if OPENJPEG_VER > JP2K_VER_12
88  freeNull(jp->image->icc_profile_buf);
89  jp->image->icc_profile_len = 0;
90 #endif
91 }
92 
93 
102 {
103  int format = JP2K_FMT_NONE;
104 
105  if (!memcmp(buf, JP2K_MAGIC_RFC3745_JP2, 12) || !memcmp(buf, JP2K_MAGIC_JP2, 4)) {
106  format = JP2K_FMT_JP2;
107  }
108  else if (!memcmp(buf, JP2K_MAGIC_J2K, 4)) {
109  format = JP2K_FMT_J2K;
110  }
111  return format;
112 }
113 
114 
115 JP2KImage read_jp2k_file(const char* fname)
116 {
117  unsigned char head[12];
118  JP2KImage jp;
119  size_t rs;
120  UNUSED(rs);
121 
122  init_jp2k(&jp);
123  //
124  if (fname==NULL) {
125  jp.state = JBXL_GRAPH_IVDARG_ERROR;
126  return jp;
127  }
128 
129  int len = (int)file_size(fname);
130 
131  FILE* fp = fopen(fname, "rb");
132  if (fp==NULL) {
133  jp.state = JBXL_GRAPH_OPFILE_ERROR;
134  return jp;
135  }
136 
137  unsigned char* data = (unsigned char*)malloc(len);
138  if (data==NULL) {
139  fclose(fp);
140  jp.state = JBXL_GRAPH_MEMORY_ERROR;
141  return jp;
142  }
143  memset(data, 0, len);
144 
145  rs = fread(head, 12, 1, fp);
146  fseek(fp, 0, 0);
147  int format = get_jp2k_format(head);
148  if (format==JP2K_FMT_NONE) format = JP2K_FMT_JPT;
149 
150  rs = fread(data, len, 1, fp);
151  fclose(fp);
152 
153  jp = read_jp2k_data(data, len, format);
154  free(data);
155 
156  return jp;
157 }
158 
159 
160 JP2KImage read_jp2k_data(unsigned char* data, int len, int format)
161 {
162  JP2KImage jp;
163  init_jp2k(&jp);
164 
165  opj_dinfo_t* codec = NULL;
166  opj_cio_t* stream = NULL;
167 
168  opj_dparameters_t parameters;
169  opj_set_default_decoder_parameters(&parameters);
170 
171  if (format==JP2K_FMT_J2K) { // JPEG 2000 codestream
172  codec = opj_create_decompress(CODEC_J2K);
173  }
174  else if (format==JP2K_FMT_JP2) { // JPEG 2000 compressed image data
175  codec = opj_create_decompress(CODEC_JP2);
176  }
177  else if (format==JP2K_FMT_JPT) { // JPEG 2000 JPIP
178  codec = opj_create_decompress(CODEC_JPT);
179  }
180  else {
181  PRINT_MESG("ERROR: JBXL::readJPEG2KData: unknown file format!\n");
182  jp.state = JBXL_GRAPH_NODATA_ERROR;
183  return jp;
184  }
185 
186  opj_setup_decoder(codec, &parameters);
187  stream = opj_cio_open((opj_common_ptr)codec, data, len);
188  jp.image = opj_decode(codec, stream);
189  if (jp.image==NULL) {
190  opj_cio_close(stream);
191  opj_destroy_decompress(codec);
192  jp.state = JBXL_GRAPH_IVDDATA_ERROR;
193  return jp;
194  }
195 
196  setup_jp2k(&jp);
197 
198  opj_cio_close(stream);
199  opj_destroy_decompress(codec);
200 
201  return jp;
202 }
203 
204 
205 BSGraph jp2k_toBSGraph(JP2KImage jp)
206 {
207  BSGraph vp;
208  int i, j, k, yp, yz, zp;
209 
210  memset(&vp, 0, sizeof(BSGraph));
211  if (jp.image==NULL || jp.image->comps==NULL) {
213  return vp;
214  }
215 
216  vp = make_BSGraph(jp.ws, jp.hs, jp.col);
217  if (vp.gp==NULL) return vp;
218 
219  for (k=0; k<jp.col; k++) {
220  zp = k*jp.ws*jp.hs;
221  for (j=0; j<jp.hs; j++) {
222  yp = j*jp.xs;
223  yz = j*jp.ws + zp;
224  for (i=0; i<jp.ws; i++) {
225  vp.gp[yz + i] = (uByte)jp.image->comps[k].data[yp + i]; // as Byte境界
226  }
227  }
228  }
229 
230  return vp;
231 }
232 
233 
234 #endif // OPENJPEG_VER <= JP2K_VER_15
235 #endif // ENABLE_OPENJPEG
236 
#define UNUSED(x)
Definition: common.h:264
unsigned char uByte
1Byte
Definition: common.h:332
BSGraph make_BSGraph(int xs, int ys, int zs)
Definition: gdata.c:66
#define GRAPH_COLOR_UNKNOWN
0x0070
Definition: gheader.h:302
#define GRAPH_COLOR_RGBA
Definition: gheader.h:283
#define GRAPH_COLOR_RGB
Definition: gheader.h:270
#define GRAPH_COLOR_GRAY
Definition: gheader.h:244
JunkBox_Lib 状態ヘッダ
#define JBXL_GRAPH_IVDARG_ERROR
無効な引数
Definition: jbxl_state.h:178
#define JBXL_GRAPH_NODATA_ERROR
データが無い
Definition: jbxl_state.h:171
#define JBXL_GRAPH_OPFILE_ERROR
ファイルのオープンエラー
Definition: jbxl_state.h:173
#define JBXL_NORMAL
正常
Definition: jbxl_state.h:32
#define JBXL_GRAPH_MEMORY_ERROR
メモリエラー
Definition: jbxl_state.h:170
#define JBXL_GRAPH_IVDDATA_ERROR
無効なデータ
Definition: jbxl_state.h:181
void free_jp2k(JP2KImage *jp)
Definition: jp2k_tool2.c:36
void init_jp2k(JP2KImage *jp)
Definition: jp2k_tool2.c:21
int get_jp2k_format(uByte *buf)
Definition: jp2k_tool2.c:102
BSGraph jp2k_toBSGraph(JP2KImage jp)
Definition: jp2k_tool2.c:249
JP2KImage read_jp2k_file(const char *fname)
Definition: jp2k_tool2.c:116
JP2KImage read_jp2k_data(const char *fname, int format)
Definition: jp2k_tool2.c:156
void setup_jp2k(JP2KImage *jp)
Definition: jp2k_tool2.c:47
JP2K TOOL HEADER.
unsigned char ** buf
Definition: jpeg_tool.h:96
unsigned char unsigned long * len
Definition: jpeg_tool.h:96
Definition: gdata.h:27
int xs
xサイズ. 4Byte.
Definition: gdata.h:28
int state
状態
Definition: gdata.h:31
uByte * gp
グラフィックデータへのポインタ. xs*ys*zs*1Byte.
Definition: gdata.h:32
unsigned long int file_size(const char *fn)
ファイルの大きさを返す.
Definition: tools.c:2309
#define freeNull(p)
Definition: tools.h:201
#define PRINT_MESG
環境依存用の出力関数.print_message()
Definition: tools.h:475
#define DEBUG_MODE
Definition: tools.h:502