Engauge Digitizer 2
Loading...
Searching...
No Matches
Jpeg2000Convert.cpp
Go to the documentation of this file.
1/*
2 * The copyright in this software is being made available under the 2-clauses
3 * BSD License, included below. This software may be subject to other third
4 * party and contributor rights, including patent rights, and no such rights
5 * are granted under this license.
6 *
7 * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
8 * Copyright (c) 2002-2014, Professor Benoit Macq
9 * Copyright (c) 2001-2003, David Janssens
10 * Copyright (c) 2002-2003, Yannick Verschueren
11 * Copyright (c) 2003-2007, Francois-Olivier Devaux
12 * Copyright (c) 2003-2014, Antonin Descampe
13 * Copyright (c) 2005, Herve Drolon, FreeImage Team
14 * Copyright (c) 2006-2007, Parvatha Elangovan
15 * All rights reserved.
16 *
17 * Redistribution and use in source and binary forms, with or without
18 * modification, are permitted provided that the following conditions
19 * are met:
20 * 1. Redistributions of source code must retain the above copyright
21 * notice, this list of conditions and the following disclaimer.
22 * 2. Redistributions in binary form must reproduce the above copyright
23 * notice, this list of conditions and the following disclaimer in the
24 * documentation and/or other materials provided with the distribution.
25 *
26 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
27 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
30 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36 * POSSIBILITY OF SUCH DAMAGE.
37 */
38
39//#include "opj_apps_config.h"
40
41#include "Logger.h"
42#include "openjpeg.h"
43#include "Jpeg2000Convert.h"
44#include <QBuffer>
45#include <QDataStream>
46#include <QDebug>
47#include <qmath.h>
48#include <string.h>
49
52{
53 int *red, *green, *blue, *alpha = nullptr;
54 int wr, hr, max;
55 int i;
56 unsigned int compno, ncomp;
58 int two, has_alpha, triple;
59 int prec, v;
60 char bufferLocal[1024];
62
63 if((prec = qFloor (image->comps[0].prec)) > 16)
64 {
65 fprintf(stderr,"%s:%d:imagetopnm\n\tprecision %d is larger than 16"
66 "\n\t: refused.\n",__FILE__,__LINE__,prec);
67 return 1;
68 }
69 two = has_alpha = 0;
70 ncomp = image->numcomps;
71
72 if (ncomp == 2 /* GRAYA */
73 || (ncomp > 2 /* RGB, RGBA */
74 && image->comps[0].dx == image->comps[1].dx
75 && image->comps[1].dx == image->comps[2].dx
76 && image->comps[0].dy == image->comps[1].dy
77 && image->comps[1].dy == image->comps[2].dy
78 && image->comps[0].prec == image->comps[1].prec
79 && image->comps[1].prec == image->comps[2].prec
80 ))
81 {
82 two = (prec > 8);
83 triple = (ncomp > 2);
84 wr = qFloor (image->comps[0].w);
85 hr = qFloor (image->comps[0].h);
86 max = (1<<prec) - 1; has_alpha = (ncomp == 4 || ncomp == 2);
87
88 red = image->comps[0].data;
89
90 if(triple)
91 {
92 green = image->comps[1].data;
93 blue = image->comps[2].data;
94 }
95 else green = blue = nullptr;
96
97 if(has_alpha)
98 {
99 const char *tt = (triple?"RGB_ALPHA":"GRAYSCALE_ALPHA");
100
102 "P7\n# OpenJPEG-%s\nWIDTH %d\nHEIGHT %d\nDEPTH %d\n"
103 "MAXVAL %d\nTUPLTYPE %s\nENDHDR\n",
104 opj_version(),
105 wr,
106 hr,
107 ncomp,
108 max,
109 tt);
110 str.writeRawData (bufferLocal,
112 alpha = image->comps[ncomp - 1].data;
113 adjustA = (image->comps[ncomp - 1].sgnd ?
114 1 << (image->comps[ncomp - 1].prec - 1) : 0);
115 }
116 else
117 {
119 "P6\n# OpenJPEG-%s\n%d %d\n%d\n",
120 opj_version(),
121 wr,
122 hr,
123 max);
124 str.writeRawData (bufferLocal,
126 adjustA = 0;
127 }
128 adjustR = (image->comps[0].sgnd ? 1 << (image->comps[0].prec - 1) : 0);
129
130 if(triple)
131 {
132 adjustG = (image->comps[1].sgnd ? 1 << (image->comps[1].prec - 1) : 0);
133 adjustB = (image->comps[2].sgnd ? 1 << (image->comps[2].prec - 1) : 0);
134 }
135 else adjustG = adjustB = 0;
136
137 for(i = 0; i < wr * hr; ++i)
138 {
139 if(two)
140 {
141 v = *red + adjustR; ++red;
142 if(v > 65535) v = 65535; else if(v < 0) v = 0;
143
145 "%c%c",
146 static_cast<unsigned char> (v>>8),
147 static_cast<unsigned char> (v));
148 str.writeRawData (bufferLocal,
149 2);
150
151 if(triple)
152 {
153 v = *green + adjustG; ++green;
154 if(v > 65535) v = 65535; else if(v < 0) v = 0;
155
157 "%c%c",
158 static_cast<unsigned char> (v>>8),
159 static_cast<unsigned char> (v));
160 str.writeRawData (bufferLocal,
161 2);
162
163 v = *blue + adjustB; ++blue;
164 if(v > 65535) v = 65535; else if(v < 0) v = 0;
165
167 "%c%c",
168 static_cast<unsigned char> (v>>8),
169 static_cast<unsigned char> (v));
170 str.writeRawData (bufferLocal,
171 2);
172
173 }/* if(triple) */
174
175 if(has_alpha)
176 {
177 v = *alpha + adjustA; ++alpha;
178 if(v > 65535) v = 65535; else if(v < 0) v = 0;
179
181 "%c%c",
182 static_cast<unsigned char> (v>>8),
183 static_cast<unsigned char> (v));
184 str.writeRawData (bufferLocal,
185 2);
186 }
187 continue;
188
189 } /* if(two) */
190
191 /* prec <= 8: */
192 v = *red++;
193 if(v > 255) v = 255; else if(v < 0) v = 0;
194
196 "%c",
197 static_cast<unsigned char> (v));
198 str.writeRawData (bufferLocal,
199 1);
200 if(triple)
201 {
202 v = *green++;
203 if(v > 255) v = 255; else if(v < 0) v = 0;
204
206 "%c",
207 static_cast<unsigned char> (v));
208 str.writeRawData (bufferLocal,
209 1);
210 v = *blue++;
211 if(v > 255) v = 255; else if(v < 0) v = 0;
212
214 "%c",
215 static_cast<unsigned char> (v));
216 str.writeRawData (bufferLocal,
217 1);
218 }
219 if(has_alpha)
220 {
221 v = *alpha++;
222 if(v > 255) v = 255; else if(v < 0) v = 0;
223
225 "%c",
226 static_cast<unsigned char> (v));
227 str.writeRawData (bufferLocal,
228 1);
229 }
230 } /* for(i */
231
232 return 0;
233 }
234
235 /* YUV or MONO: */
236
237 if (image->numcomps > ncomp)
238 {
239 LOG4CPP_WARN_S ((*mainCat)) << "imagetopnm will only use the first component";
240 }
241
242 for (compno = 0; compno < ncomp; compno++)
243 {
244 wr = qFloor (image->comps[compno].w);
245 hr = qFloor (image->comps[compno].h);
246 prec = qFloor (image->comps[compno].prec);
247 max = (1<<prec) - 1;
248
250 "P5\n#OpenJPEG-%s\n%d %d\n%d\n",
251 opj_version(),
252 wr,
253 hr,
254 max);
255 str.writeRawData (bufferLocal,
257
258 red = image->comps[compno].data;
259 adjustR =
260 (image->comps[compno].sgnd ? 1 << (image->comps[compno].prec - 1) : 0);
261
262 if(prec > 8)
263 {
264 for (i = 0; i < wr * hr; i++)
265 {
266 v = *red + adjustR; ++red;
267 if(v > 65535) v = 65535; else if(v < 0) v = 0;
268
270 "%c%c",
271 static_cast<unsigned char> (v>>8),
272 static_cast<unsigned char> (v));
273 str.writeRawData (bufferLocal,
274 2);
275
276 if(has_alpha)
277 {
278 v = *alpha++;
279 if(v > 65535) v = 65535; else if(v < 0) v = 0;
280
282 "%c%c",
283 static_cast<unsigned char> (v>>8),
284 static_cast<unsigned char> (v));
285 str.writeRawData (bufferLocal,
286 2);
287 }
288 }/* for(i */
289 }
290 else /* prec <= 8 */
291 {
292 for(i = 0; i < wr * hr; ++i)
293 {
294 v = *red + adjustR; ++red;
295 if(v > 255) v = 255; else if(v < 0) v = 0;
296
298 "%c",
299 static_cast<unsigned char> (v));
300 str.writeRawData (bufferLocal,
301 1);
302 }
303 }
304 } /* for (compno */
305
306 return 0;
307}/* imagetopnm() */
const int INNER_RADIUS_MIN
int imagetopnm(opj_image_t *image, QBuffer &buffer)
log4cpp::Category * mainCat
Definition Logger.cpp:14
#define LOG4CPP_WARN_S(logger)
Definition convenience.h:14