JunkBox_Lib 1.10.1
Loading...
Searching...
No Matches
jp2k_tool2.c
Go to the documentation of this file.
1
13#include "jp2k_tool.h"
14#include "jbxl_state.h"
15
16
17#ifdef ENABLE_OPENJPEG
18
19#if OPENJPEG_VER >= JP2K_VER_20
20
21void init_jp2k(JP2KImage* jp)
22{
23 if (jp==NULL) return;
24 //
25 jp->xs = 0;
26 jp->ys = 0;
27 jp->ws = 0;
28 jp->hs = 0;
29 jp->col = 0;
30 jp->cmode = GRAPH_COLOR_RGBA;
31 jp->state = JBXL_NORMAL;
32 jp->image = NULL;
33}
34
35
36void free_jp2k(JP2KImage* jp)
37{
38 if (jp==NULL) return;
39 //
40 if (jp->image!=NULL) {
41 opj_image_destroy(jp->image);
42 }
43 init_jp2k(jp);
44}
45
46
47void setup_jp2k(JP2KImage* jp)
48{
49 if (jp==NULL || jp->image==NULL || jp->image->comps==NULL) return;
50 //
51 jp->xs = jp->image->x1 - jp->image->x0;
52 jp->ys = jp->image->y1 - jp->image->y0;
53
54 int fac = (int)jp->image->comps->factor;
55 jp->ws = (jp->xs + (1<<fac) - 1)>>fac;
56 jp->hs = (jp->ys + (1<<fac) - 1)>>fac;
57
58 jp->col = (int)jp->image->numcomps;
59 /*
60 if (jp->image->color_space==OPJ_CLRSPC_SRGB) { /// 1
61 jp->col = 3;
62 }
63 else if (jp->image->color_space==OPJ_CLRSPC_GRAY) { /// 2
64 jp->col = 1;
65 }
66 else if (jp->image->color_space==OPJ_CLRSPC_SYCC || jp->image->color_space==OPJ_CLRSPC_EYCC) { /// 3, 4
67 jp->col = 3;
68 }
69 else if (jp->image->color_space==OPJ_CLRSPC_CMYK) { /// 5
70 jp->col = 4;
71 }
72 */
73
74 // 設定されないものについては,未対応
75 jp->cmode = GRAPH_COLOR_UNKNOWN;
76#if OPENJPEG_VER < JP2K_VER_25
77 int depth = (int)jp->image->comps->bpp;
78#else
79 int depth = (int)jp->image->comps->prec;
80#endif
81
82 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);
83 if (depth==0 || depth==8) {
84 if (jp->col==1) jp->cmode = GRAPH_COLOR_GRAY;
85 else if (jp->col==3) jp->cmode = GRAPH_COLOR_RGB;
86 else if (jp->col==4) jp->cmode = GRAPH_COLOR_RGBA;
87 }
88 if (jp->cmode==GRAPH_COLOR_UNKNOWN) {
89 PRINT_MESG("JBXL::JPEG2KIMage::setup_image: unknown color mode: col = %d, depth = %d\n", jp->col, depth);
90 jp->cmode = GRAPH_COLOR_RGBA;
91 }
92}
93
94
103{
104 int format = JP2K_FMT_NONE;
105
106 if (!memcmp(buf, JP2K_MAGIC_RFC3745_JP2, 12) || !memcmp(buf, JP2K_MAGIC_JP2, 4)) {
107 format = JP2K_FMT_JP2;
108 }
109 else if (!memcmp(buf, JP2K_MAGIC_J2K, 4)) {
110 format = JP2K_FMT_J2K;
111 }
112 return format;
113}
114
115
116JP2KImage read_jp2k_file(const char* fname)
117{
118 unsigned char head[12];
119 JP2KImage jp;
120 size_t rs;
121 UNUSED(rs);
122
123 init_jp2k(&jp);
124 //
125 if (fname==NULL) {
126 jp.state = JBXL_GRAPH_IVDARG_ERROR;
127 return jp;
128 }
129
130 FILE* fp = fopen(fname, "rb");
131 if (fp==NULL) {
132 jp.state = JBXL_GRAPH_OPFILE_ERROR;
133 return jp;
134 }
135
136 rs = fread(head, 12, 1, fp);
137 fseek(fp, 0, 0);
138 int format = get_jp2k_format(head);
139 if (format==JP2K_FMT_NONE) format = JP2K_FMT_JPT;
140
141#if OPENJPEG_VER < JP2K_VER_21
142 jp = read_jp2k_data(fp, format);
143 fclose(fp);
144#else
145 fclose(fp);
146 jp = read_jp2k_data(fname, format);
147#endif
148
149 return jp;
150}
151
152
153#if OPENJPEG_VER < JP2K_VER_21
154JP2KImage read_jp2k_data(FILE* fp, int format)
155#else
156JP2KImage read_jp2k_data(const char* fname, int format)
157#endif
158{
159 JP2KImage jp;
160 init_jp2k(&jp);
161
162 opj_stream_t* stream = NULL;
163 opj_codec_t* codec = NULL;
164
165 opj_dparameters_t parameters;
166 opj_set_default_decoder_parameters(&parameters);
167
168#if OPENJPEG_VER < JP2K_VER_21
169 stream = opj_stream_create_default_file_stream(fp, 1); // 2.0.0
170#else
171 stream = opj_stream_create_default_file_stream(fname, 1); // 2.1.0
172#endif
173
174 if (stream==NULL){
175 jp.state = JBXL_GRAPH_RDFILE_ERROR;
176 return jp;
177 }
178
179 if (format==JP2K_FMT_J2K) { // JPEG 2000 codestream
180 codec = opj_create_decompress(OPJ_CODEC_J2K);
181 }
182 else if (format==JP2K_FMT_JP2) { // JPEG 2000 compressed image data
183 codec = opj_create_decompress(OPJ_CODEC_JP2);
184 }
185 else if (format==JP2K_FMT_JPT) { // JPEG 2000 JPIP
186 codec = opj_create_decompress(OPJ_CODEC_JPT);
187 }
188 else {
189 PRINT_MESG("ERROR: JBXL::readJPEG2KData: unknown file format!\n");
190 opj_stream_destroy(stream);
191 return jp;
192 }
193
194 if (!opj_setup_decoder(codec, &parameters) ){
195 opj_stream_destroy(stream);
196 opj_destroy_codec(codec);
197 jp.state = JBXL_GRAPH_ERROR;
198 return jp;
199 }
200
201 // allow_partial
202 if (!opj_decoder_set_strict_mode(codec, OPJ_FALSE)) { // #define OPJ_FALSE 0
203 opj_stream_destroy(stream);
204 opj_destroy_codec(codec);
205 jp.state = JBXL_GRAPH_ERROR;
206 return jp;
207 }
208
209 /*
210 if (!opj_codec_set_threads(codec, 1)) {
211 opj_stream_destroy(stream);
212 opj_destroy_codec(codec);
213 jp.state = JBXL_GRAPH_ERROR;
214 return jp;
215 }*/
216
217 if (!opj_read_header(stream, codec, &jp.image)){
218 opj_stream_destroy(stream);
219 opj_destroy_codec(codec);
220 jp.state = JBXL_GRAPH_ERROR;
221 return jp;
222 }
223
224 if (!opj_set_decode_area(codec, jp.image, 0, 0, 0, 0)){
225 opj_stream_destroy(stream);
226 opj_destroy_codec(codec);
227 free_jp2k(&jp);
228 jp.state = JBXL_GRAPH_ERROR;
229 return jp;
230 }
231
232 if (!(opj_decode(codec, stream, jp.image) && opj_end_decompress(codec, stream))) {
233 opj_destroy_codec(codec);
234 opj_stream_destroy(stream);
235 free_jp2k(&jp);
236 jp.state = JBXL_GRAPH_ERROR;
237 return jp;
238 }
239
240 setup_jp2k(&jp);
241
242 opj_stream_destroy(stream);
243 opj_destroy_codec(codec);
244
245 return jp;
246}
247
248
250{
251 BSGraph vp;
252 int i, j, k, yp, yz, zp;
253
254 memset(&vp, 0, sizeof(BSGraph));
255 if (jp.image==NULL || jp.image->comps==NULL) {
257 return vp;
258 }
259
260 vp = make_BSGraph(jp.ws, jp.hs, jp.col);
261 if (vp.gp==NULL) return vp;
262
263 for (k=0; k<jp.col; k++) {
264 zp = k*jp.ws*jp.hs;
265 for (j=0; j<jp.hs; j++) {
266 yp = j*jp.xs;
267 yz = j*jp.ws + zp;
268 for (i=0; i<jp.ws; i++) {
269 vp.gp[yz + i] = (uByte)jp.image->comps[k].data[yp + i]; // as Byte境界
270 }
271 }
272 }
273 return vp;
274}
275
276
277#endif // OPENJPEG_VER >= JP2K_VER_20
278#endif // ENABLE_OPENJPEG
279
#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_ERROR
GRAPH ライブラリーのエラー
Definition jbxl_state.h:167
#define JBXL_GRAPH_OPFILE_ERROR
ファイルのオープンエラー
Definition jbxl_state.h:173
#define JBXL_GRAPH_RDFILE_ERROR
ファイルの読み込みエラー
Definition jbxl_state.h:174
#define JBXL_NORMAL
正常
Definition jbxl_state.h:32
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
int xs
xサイズ. 4Byte.
Definition gdata.h:28
int state
状態
Definition gdata.h:31
uByte * gp
グラフィックデータへのポインタ. xs*ys*zs*1Byte.
Definition gdata.h:32
#define PRINT_MESG
環境依存用の出力関数.print_message()
Definition tools.h:475
#define DEBUG_MODE
Definition tools.h:502