1 package de.desy.acop.video.displayer.timage;
2
3 import java.awt.Color;
4 import java.awt.Insets;
5 import java.awt.image.BufferedImage;
6
7 import de.desy.acop.video.displayer.ColorLookupTable;
8 import de.desy.acop.video.displayer.ColorMap;
9 import de.desy.acop.video.displayer.ImageBuffer;
10 import de.desy.acop.video.displayer.ImageFlag;
11 import de.desy.acop.video.displayer.ImageFormat;
12 import de.desy.tine.types.IMAGE;
13 import de.desy.tine.types.IMAGE.FrameHeader;
14 import de.desy.tine.types.IMAGE.SourceHeader;
15
16
17
18
19
20
21
22
23 public class TImageConverter {
24
25
26
27
28
29 private ImageBuffer _imageBuffer = new ImageBuffer();
30
31
32
33
34 private ColorMap _colorMap = ColorMap.GRAYSCALE;
35
36
37
38
39 private ColorLookupTable _colorLookup;
40
41
42
43
44 public TImageConverter() {
45 super();
46 }
47
48
49
50
51
52
53
54
55
56
57
58 public BufferedImage parseTineImage(final IMAGE timage, boolean aoiExpansion) {
59 return parseTineImage(timage, aoiExpansion, ColorMap.GRAYSCALE);
60 }
61
62
63
64
65
66
67
68
69
70
71
72
73
74 public BufferedImage parseTineImage(final IMAGE timage, boolean aoiExpansion, ColorMap colorMap) {
75 if (timage == null)
76 throw new IllegalStateException("timage == null!");
77
78 if (colorMap == null)
79 throw new IllegalStateException("colorMap == null!");
80
81 final IMAGE ti = timage.clone();
82
83 FrameHeader hdr = ti.getFrameHeader();
84 ImageFormat imageFormat = ImageFormat.valueOf(hdr.imageFormat);
85
86
87 if (imageFormat == ImageFormat.IMAGE_FORMAT_GRAY
88 || (imageFormat == ImageFormat.IMAGE_FORMAT_JPEG && hdr.bytesPerPixel == 1)
89 || (imageFormat == ImageFormat.IMAGE_FORMAT_HUFFYUV && ImageFormat.IMAGE_FORMAT_GRAY
90 .equals(hdr.sourceFormat))) {
91 if (_colorLookup == null
92 || _colorLookup.getBytesPerPixel() != hdr.bytesPerPixel
93 || _colorLookup.getEffBitsPerPixel() != hdr.effectiveBitsPerPixel || _colorMap != colorMap) {
94 _colorLookup = new ColorLookupTable(colorMap, hdr.bytesPerPixel, hdr.effectiveBitsPerPixel);
95 _imageBuffer.setColorLookupTable(_colorLookup.getRGB());
96 }
97 }
98 _colorMap = colorMap;
99 BufferedImage bi = TImageUtils.toBufferedImage(_imageBuffer.createImage(ti));
100 if (aoiExpansion && (hdr.aoiWidth != -1 || hdr.aoiHeight != -1))
101 bi = TImageUtils.addInsets(bi, new Insets(hdr.yStart, hdr.xStart,
102 hdr.sourceHeight - hdr.aoiHeight - hdr.yStart,
103 hdr.sourceWidth - hdr.aoiWidth - hdr.xStart), Color.black);
104 return bi;
105 }
106
107
108
109
110
111
112
113
114
115
116
117
118 public BufferedImage parseTineImageNoClone(final IMAGE timage, boolean aoiExpansion) {
119 return parseTineImageNoClone(timage, aoiExpansion, ColorMap.GRAYSCALE);
120 }
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138 public BufferedImage parseTineImageNoClone(final IMAGE timage, boolean aoiExpansion, ColorMap colorMap) {
139 if (timage == null)
140 throw new IllegalStateException("timage == null!");
141
142 if (colorMap == null)
143 throw new IllegalStateException("colorMap == null!");
144
145 FrameHeader hdr = timage.getFrameHeader();
146 ImageFormat imageFormat = ImageFormat.valueOf(hdr.imageFormat);
147
148
149 if (imageFormat == ImageFormat.IMAGE_FORMAT_GRAY
150 || (imageFormat == ImageFormat.IMAGE_FORMAT_JPEG && hdr.bytesPerPixel == 1)
151 || (imageFormat == ImageFormat.IMAGE_FORMAT_HUFFYUV && ImageFormat.IMAGE_FORMAT_GRAY
152 .equals(hdr.sourceFormat))) {
153 if (_colorLookup == null
154 || _colorLookup.getBytesPerPixel() != hdr.bytesPerPixel
155 || _colorLookup.getEffBitsPerPixel() != hdr.effectiveBitsPerPixel || _colorMap != colorMap) {
156 _colorLookup = new ColorLookupTable(colorMap, hdr.bytesPerPixel, hdr.effectiveBitsPerPixel);
157 _imageBuffer.setColorLookupTable(_colorLookup.getRGB());
158 }
159 }
160 _colorMap = colorMap;
161 BufferedImage bi = TImageUtils.toBufferedImage(_imageBuffer.createImage(timage));
162 if (aoiExpansion && (hdr.aoiWidth != -1 || hdr.aoiHeight != -1))
163 bi = TImageUtils.addInsets(bi, new Insets(hdr.yStart, hdr.xStart,
164 hdr.sourceHeight - hdr.aoiHeight - hdr.yStart,
165 hdr.sourceWidth - hdr.aoiWidth - hdr.xStart), Color.black);
166 return bi;
167 }
168
169
170
171
172
173
174
175 @SuppressWarnings("deprecation")
176 public static IMAGE parseBufferedImage(BufferedImage src) {
177 if (src == null)
178 throw new IllegalStateException("src == null!");
179
180
181
182 int width = src.getWidth();
183 int height = src.getHeight();
184 int numPixels = width * height;
185 int bytesPerPixel = 3;
186 int[] pixels = src.getRGB(0, 0, width, height, null, 0, width);
187 if (pixels == null)
188 throw new IllegalArgumentException("Can't get array of RGB pixels from buffered image!");
189
190 final IMAGE timage = new IMAGE(0);
191
192 IMAGE.FrameHeader frameHeader = timage.getFrameHeader();
193 frameHeader.bytesPerPixel = bytesPerPixel;
194 frameHeader.effectiveBitsPerPixel = 24;
195 frameHeader.imageFormat = frameHeader.sourceFormat = ImageFormat.IMAGE_FORMAT_RGB.getId();
196 frameHeader.appendedFrameSize = numPixels * bytesPerPixel;
197 frameHeader.imageFlags |= ImageFlag.IMAGE_LOSSLESS.getId();
198 frameHeader.sourceHeight = height;
199 frameHeader.sourceWidth = width;
200 frameHeader.xScale = frameHeader.yScale = 1;
201
202 IMAGE.SourceHeader sourceHeader = timage.getSourceHeader();
203 sourceHeader.totalLength = IMAGE.HEADER_SIZE + frameHeader.appendedFrameSize;
204
205 int pos = 0;
206 byte[] buf = new byte[frameHeader.appendedFrameSize];
207 for (int i = 0; i < numPixels; i++) {
208 buf[pos++] = (byte) ((pixels[i] >> 16) & 0xff);
209 buf[pos++] = (byte) ((pixels[i] >> 8) & 0xff);
210 buf[pos++] = (byte) (pixels[i] & 0xff);
211 }
212
213 timage.setImageFrameBuffer(buf);
214 return timage;
215 }
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242 @SuppressWarnings("deprecation")
243 public static IMAGE parseBufferedImage(BufferedImage bi, FrameHeader frameHeader, SourceHeader sourceHeader) {
244 if (bi == null)
245 throw new IllegalStateException("bi == null!");
246
247 if (frameHeader == null)
248 throw new IllegalStateException("frameHeader == null!");
249
250 if (sourceHeader == null)
251 throw new IllegalStateException("sourceHeader == null!");
252
253 int width = bi.getWidth();
254 int height = bi.getHeight();
255 int[] pixels = bi.getRGB(0, 0, width, height, null, 0, width);
256 if (pixels == null)
257 throw new IllegalArgumentException("Can't get array of RGB pixels from buffered image!");
258
259 int numPixels = width * height;
260
261 int itype = bi.getType();
262
263 int pos = 0;
264 byte[] buf;
265
266 switch (itype) {
267 case BufferedImage.TYPE_INT_RGB:
268
269 frameHeader.bytesPerPixel = 3;
270 frameHeader.effectiveBitsPerPixel = 24;
271 frameHeader.imageFormat = frameHeader.sourceFormat = ImageFormat.IMAGE_FORMAT_RGB.getId();
272 frameHeader.appendedFrameSize = numPixels * frameHeader.bytesPerPixel;
273
274 buf = new byte[frameHeader.appendedFrameSize];
275
276 for (int i = 0; i < numPixels; i++) {
277 buf[pos++] = (byte) ((pixels[i] >> 16) & 0xff);
278 buf[pos++] = (byte) ((pixels[i] >> 8) & 0xff);
279 buf[pos++] = (byte) (pixels[i] & 0xff);
280 }
281 break;
282
283 case BufferedImage.TYPE_BYTE_GRAY:
284 frameHeader.bytesPerPixel = 1;
285 frameHeader.effectiveBitsPerPixel = 8;
286 frameHeader.imageFormat = frameHeader.sourceFormat = ImageFormat.IMAGE_FORMAT_GRAY.getId();
287 frameHeader.appendedFrameSize = numPixels * frameHeader.bytesPerPixel;
288
289 buf = new byte[frameHeader.appendedFrameSize];
290
291 for (int i = 0; i < numPixels; i++)
292 buf[i] = (byte) (pixels[i] & 0xff);
293
294 break;
295
296 default:
297 throw new IllegalArgumentException("Unsupported type of buffered image: " + itype);
298 }
299
300 frameHeader.sourceWidth = width;
301 frameHeader.sourceHeight = height;
302
303 frameHeader.aoiHeight = frameHeader.aoiWidth = -1;
304 frameHeader.xStart = frameHeader.yStart = -1;
305
306 final IMAGE timage = new IMAGE(0);
307 TImageUtils.setFrameHeader(timage, frameHeader);
308 TImageUtils.setSourceHeader(timage, sourceHeader);
309 timage.setImageFrameBuffer(buf);
310
311 return timage;
312 }
313 }