JunkBox_Lib 1.10.1
Loading...
Searching...
No Matches
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
22void 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
35void 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
46void 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
115JP2KImage 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
160JP2KImage 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
205BSGraph 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
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