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