00001
00018 #include "Jpeg2KTool.h"
00019
00020
00021 #ifdef ENABLE_OPENJPEG
00022
00023 #if OPENJPEG_VER <= JP2K_VER_15
00024
00025
00026 using namespace jbxl;
00027
00028
00029 void JPEG2KImage::init(void)
00030 {
00031 xs = 0;
00032 ys = 0;
00033 ws = 0;
00034 hs = 0;
00035 col = 0;
00036 cmode = GRAPH_COLOR_RGBA;
00037 state = 0;
00038 image = NULL;
00039 }
00040
00041
00042 bool JPEG2KImage::isNull(void)
00043 {
00044 if (image!=NULL && image->comps!=NULL) return false;
00045 return true;
00046 }
00047
00048
00049 void JPEG2KImage::free(void)
00050 {
00051 if (image!=NULL) {
00052 opj_image_destroy(image);
00053 }
00054
00055 init();
00056 }
00057
00058
00059 void JPEG2KImage::fill(int v)
00060 {
00061 if (!isNull()) {
00062 for (int k=0; k<col; k++) {
00063 if (image->comps[k].data!=NULL) {
00064 for (int i=0; i<xs*ys; i++) {
00065 image->comps[k].data[i] = v;
00066 }
00067 }
00068 }
00069 }
00070 }
00071
00072
00073 void JPEG2KImage::setup_image(void)
00074 {
00075 if (!isNull()) {
00076
00077 xs = image->x1 - image->x0;
00078 ys = image->y1 - image->y0;
00079
00080 int fac = (int)image->comps->factor;
00081 ws = (xs + (1<<fac) -1)>>fac;
00082 hs = (ys + (1<<fac) -1)>>fac;
00083
00084 col = (int)image->numcomps;
00085 if (image->color_space==CLRSPC_SRGB) {
00086 col = 3;
00087 }
00088 else if (image->color_space==CLRSPC_GRAY) {
00089 col = 1;
00090 }
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103 cmode = GRAPH_COLOR_UNKNOWN;
00104 int depth = (int)image->comps->bpp;
00105 if (depth==0) {
00106 if (col==3) cmode = GRAPH_COLOR_RGB;
00107 else if (col==4) cmode = GRAPH_COLOR_RGBA;
00108 else if (col==1) cmode = GRAPH_COLOR_MONO;
00109 }
00110 else if (depth==32) {
00111 if (col==3) cmode = GRAPH_COLOR_RGB;
00112 else if (col==4) cmode = GRAPH_COLOR_RGBA;
00113 }
00114 else if (depth==24) {
00115 if (col==3) cmode = GRAPH_COLOR_RGB;
00116 }
00117 else if (depth==16) {
00118 if (col==1) cmode = GRAPH_COLOR_MONO16;
00119 else if (col==3) cmode = GRAPH_COLOR_RGB16;
00120 else if (col==4) cmode = GRAPH_COLOR_RGBA16;
00121 }
00122 else if (depth==8) {
00123 if (col==1) cmode = GRAPH_COLOR_MONO;
00124 }
00125
00126
00127 #if OPENJPEG_VER > JP2K_VER_12
00128 freeNull(image->icc_profile_buf);
00129 image->icc_profile_len = 0;
00130 #endif
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154 }
00155 }
00156
00157
00158
00160
00161 JPEG2KImage jbxl::readJPEG2KFile(const char* fname)
00162 {
00163 JPEG2KImage jp;
00164
00165 if (fname==NULL) {
00166 jp.state = JBXL_GRAPH_IVDARG_ERROR;
00167 return jp;
00168 }
00169
00170 int len = (int)file_size(fname);
00171
00172 FILE* fp = fopen(fname, "rb");
00173 if (fp==NULL) {
00174 jp.state = JBXL_GRAPH_OPFILE_ERROR;
00175 return jp;
00176 }
00177
00178 unsigned char* data = (unsigned char*)malloc(len);
00179 if (data==NULL) {
00180 fclose(fp);
00181 jp.state = JBXL_GRAPH_MEMORY_ERROR;
00182 return jp;
00183 }
00184
00185 Buffer buf = read_Buffer_data(fp, 12);
00186 if (buf.vldsz<12) {
00187 free_Buffer(&buf);
00188 jp.state = JBXL_GRAPH_FILESZ_ERROR;
00189 fclose(fp);
00190 return jp;
00191 }
00192
00193 fseek(fp, 0, 0);
00194 int format = isJPEG2KHeader(buf);
00195 if (format==JP2K_FMT_NONE) format = JP2K_FMT_JPT;
00196 free_Buffer(&buf);
00197
00198 fread(data, len, 1, fp);
00199 fclose(fp);
00200
00201 jp = readJPEG2KData(data, len, format);
00202 ::free(data);
00203
00204 return jp;
00205 }
00206
00207
00208 JPEG2KImage jbxl::readJPEG2KData(unsigned char* data, int len, int format)
00209 {
00210 JPEG2KImage jp;
00211
00212 opj_dinfo_t* codec = NULL;
00213 opj_cio_t* stream = NULL;
00214
00215 opj_dparameters_t parameters;
00216 opj_set_default_decoder_parameters(¶meters);
00217
00218 if (format==JP2K_FMT_J2K) {
00219 codec = opj_create_decompress(CODEC_J2K);
00220 }
00221 else if (format==JP2K_FMT_JP2) {
00222 codec = opj_create_decompress(CODEC_JP2);
00223 }
00224 else if (format==JP2K_FMT_JPT) {
00225 codec = opj_create_decompress(CODEC_JPT);
00226 }
00227 else {
00228 PRINT_MESG("JBXL::readJPEG2KData: ERROR: unknown file format!\n");
00229 jp.state = JBXL_GRAPH_NODATA_ERROR;
00230 return jp;
00231 }
00232
00233 opj_setup_decoder(codec, ¶meters);
00234 stream = opj_cio_open((opj_common_ptr)codec, data, len);
00235 jp.image = opj_decode(codec, stream);
00236 if (jp.image==NULL) {
00237 opj_cio_close(stream);
00238 opj_destroy_decompress(codec);
00239 jp.state = JBXL_GRAPH_IVDDATA_ERROR;
00240 return jp;
00241 }
00242
00243 jp.setup_image();
00244
00245 opj_cio_close(stream);
00246 opj_destroy_decompress(codec);
00247
00248 return jp;
00249 }
00250
00251
00259 int jbxl::isJPEG2KHeader(Buffer buf)
00260 {
00261 int format = JP2K_FMT_NONE;
00262
00263 if (!memcmp(buf.buf, JP2K_MAGIC_RFC3745_JP2, 12) || !memcmp(buf.buf, JP2K_MAGIC_JP2, 4)) {
00264 format = JP2K_FMT_JP2;
00265 }
00266 else if (!memcmp(buf.buf, JP2K_MAGIC_J2K, 4)) {
00267 format = JP2K_FMT_J2K;
00268 }
00269 return format;
00270 }
00271
00272
00273 #endif // OPENJPEG_VER
00274 #endif // ENABLE_OPENJPEG
00275
00276