00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 #include "Logger.h"
00042 #include "openjpeg.h"
00043 #include "Jpeg2000Convert.h"
00044 #include <QBuffer>
00045 #include <QDataStream>
00046 #include <QDebug>
00047 #include <string.h>
00048
00049 int imagetopnm(opj_image_t * image,
00050 QBuffer &buffer)
00051 {
00052 int *red, *green, *blue, *alpha = NULL;
00053 int wr, hr, max;
00054 int i;
00055 unsigned int compno, ncomp;
00056 int adjustR, adjustG, adjustB, adjustA;
00057 int two, has_alpha, triple;
00058 int prec, v;
00059 char bufferLocal[1024];
00060 QDataStream str (&buffer);
00061
00062 if((prec = (int)image->comps[0].prec) > 16)
00063 {
00064 fprintf(stderr,"%s:%d:imagetopnm\n\tprecision %d is larger than 16"
00065 "\n\t: refused.\n",__FILE__,__LINE__,prec);
00066 return 1;
00067 }
00068 two = has_alpha = 0;
00069 ncomp = image->numcomps;
00070
00071 if (ncomp == 2
00072 || (ncomp > 2
00073 && image->comps[0].dx == image->comps[1].dx
00074 && image->comps[1].dx == image->comps[2].dx
00075 && image->comps[0].dy == image->comps[1].dy
00076 && image->comps[1].dy == image->comps[2].dy
00077 && image->comps[0].prec == image->comps[1].prec
00078 && image->comps[1].prec == image->comps[2].prec
00079 ))
00080 {
00081 two = (prec > 8);
00082 triple = (ncomp > 2);
00083 wr = (int)image->comps[0].w; hr = (int)image->comps[0].h;
00084 max = (1<<prec) - 1; has_alpha = (ncomp == 4 || ncomp == 2);
00085
00086 red = image->comps[0].data;
00087
00088 if(triple)
00089 {
00090 green = image->comps[1].data;
00091 blue = image->comps[2].data;
00092 }
00093 else green = blue = NULL;
00094
00095 if(has_alpha)
00096 {
00097 const char *tt = (triple?"RGB_ALPHA":"GRAYSCALE_ALPHA");
00098
00099 sprintf(bufferLocal,
00100 "P7\n# OpenJPEG-%s\nWIDTH %d\nHEIGHT %d\nDEPTH %d\n"
00101 "MAXVAL %d\nTUPLTYPE %s\nENDHDR\n",
00102 opj_version(),
00103 wr,
00104 hr,
00105 ncomp,
00106 max,
00107 tt);
00108 str.writeRawData (bufferLocal,
00109 strlen (bufferLocal));
00110 alpha = image->comps[ncomp - 1].data;
00111 adjustA = (image->comps[ncomp - 1].sgnd ?
00112 1 << (image->comps[ncomp - 1].prec - 1) : 0);
00113 }
00114 else
00115 {
00116 sprintf(bufferLocal,
00117 "P6\n# OpenJPEG-%s\n%d %d\n%d\n",
00118 opj_version(),
00119 wr,
00120 hr,
00121 max);
00122 str.writeRawData (bufferLocal,
00123 strlen (bufferLocal));
00124 adjustA = 0;
00125 }
00126 adjustR = (image->comps[0].sgnd ? 1 << (image->comps[0].prec - 1) : 0);
00127
00128 if(triple)
00129 {
00130 adjustG = (image->comps[1].sgnd ? 1 << (image->comps[1].prec - 1) : 0);
00131 adjustB = (image->comps[2].sgnd ? 1 << (image->comps[2].prec - 1) : 0);
00132 }
00133 else adjustG = adjustB = 0;
00134
00135 for(i = 0; i < wr * hr; ++i)
00136 {
00137 if(two)
00138 {
00139 v = *red + adjustR; ++red;
00140 if(v > 65535) v = 65535; else if(v < 0) v = 0;
00141
00142 sprintf(bufferLocal,
00143 "%c%c",
00144 (unsigned char)(v>>8),
00145 (unsigned char)v);
00146 str.writeRawData (bufferLocal,
00147 2);
00148
00149 if(triple)
00150 {
00151 v = *green + adjustG; ++green;
00152 if(v > 65535) v = 65535; else if(v < 0) v = 0;
00153
00154 sprintf(bufferLocal,
00155 "%c%c",
00156 (unsigned char)(v>>8),
00157 (unsigned char)v);
00158 str.writeRawData (bufferLocal,
00159 2);
00160
00161 v = *blue + adjustB; ++blue;
00162 if(v > 65535) v = 65535; else if(v < 0) v = 0;
00163
00164 sprintf(bufferLocal,
00165 "%c%c",
00166 (unsigned char)(v>>8),
00167 (unsigned char)v);
00168 str.writeRawData (bufferLocal,
00169 2);
00170
00171 }
00172
00173 if(has_alpha)
00174 {
00175 v = *alpha + adjustA; ++alpha;
00176 if(v > 65535) v = 65535; else if(v < 0) v = 0;
00177
00178 sprintf(bufferLocal,
00179 "%c%c",
00180 (unsigned char)(v>>8),
00181 (unsigned char)v);
00182 str.writeRawData (bufferLocal,
00183 2);
00184 }
00185 continue;
00186
00187 }
00188
00189
00190 v = *red++;
00191 if(v > 255) v = 255; else if(v < 0) v = 0;
00192
00193 sprintf(bufferLocal,
00194 "%c",
00195 (unsigned char)v);
00196 str.writeRawData (bufferLocal,
00197 1);
00198 if(triple)
00199 {
00200 v = *green++;
00201 if(v > 255) v = 255; else if(v < 0) v = 0;
00202
00203 sprintf(bufferLocal,
00204 "%c",
00205 (unsigned char)v);
00206 str.writeRawData (bufferLocal,
00207 1);
00208 v = *blue++;
00209 if(v > 255) v = 255; else if(v < 0) v = 0;
00210
00211 sprintf(bufferLocal,
00212 "%c",
00213 (unsigned char)v);
00214 str.writeRawData (bufferLocal,
00215 1);
00216 }
00217 if(has_alpha)
00218 {
00219 v = *alpha++;
00220 if(v > 255) v = 255; else if(v < 0) v = 0;
00221
00222 sprintf(bufferLocal,
00223 "%c",
00224 (unsigned char)v);
00225 str.writeRawData (bufferLocal,
00226 1);
00227 }
00228 }
00229
00230 return 0;
00231 }
00232
00233
00234
00235 if (image->numcomps > ncomp)
00236 {
00237 LOG4CPP_WARN_S ((*mainCat)) << "imagetopnm will only use the first component";
00238 }
00239
00240 for (compno = 0; compno < ncomp; compno++)
00241 {
00242 wr = (int)image->comps[compno].w;
00243 hr = (int)image->comps[compno].h;
00244 prec = (int)image->comps[compno].prec;
00245 max = (1<<prec) - 1;
00246
00247 sprintf(bufferLocal,
00248 "P5\n#OpenJPEG-%s\n%d %d\n%d\n",
00249 opj_version(),
00250 wr,
00251 hr,
00252 max);
00253 str.writeRawData (bufferLocal,
00254 strlen (bufferLocal));
00255
00256 red = image->comps[compno].data;
00257 adjustR =
00258 (image->comps[compno].sgnd ? 1 << (image->comps[compno].prec - 1) : 0);
00259
00260 if(prec > 8)
00261 {
00262 for (i = 0; i < wr * hr; i++)
00263 {
00264 v = *red + adjustR; ++red;
00265 if(v > 65535) v = 65535; else if(v < 0) v = 0;
00266
00267 sprintf(bufferLocal,
00268 "%c%c",
00269 (unsigned char)(v>>8), (unsigned char)v);
00270 str.writeRawData (bufferLocal,
00271 2);
00272
00273 if(has_alpha)
00274 {
00275 v = *alpha++;
00276 if(v > 65535) v = 65535; else if(v < 0) v = 0;
00277
00278 sprintf(bufferLocal,
00279 "%c%c",
00280 (unsigned char)(v>>8), (unsigned char)v);
00281 str.writeRawData (bufferLocal,
00282 2);
00283 }
00284 }
00285 }
00286 else
00287 {
00288 for(i = 0; i < wr * hr; ++i)
00289 {
00290 v = *red + adjustR; ++red;
00291 if(v > 255) v = 255; else if(v < 0) v = 0;
00292
00293 sprintf(bufferLocal,
00294 "%c",
00295 (unsigned char)v);
00296 str.writeRawData (bufferLocal,
00297 1);
00298 }
00299 }
00300 }
00301
00302 return 0;
00303 }