1 package de.desy.video.sw;
2
3 import java.io.File;
4
5 import de.desy.tine.types.*;
6
7 import java.awt.image.BufferedImage;
8 import java.net.URL;
9 import java.io.IOException;
10 import javax.imageio.ImageIO;
11 import java.net.URISyntaxException;
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 public final class CBasicImageLoaderV3 {
42
43
44
45
46
47 public static final void printLoadableFormats() {
48 String[] names = ImageIO.getReaderFormatNames();
49 for ( String name: names )
50 {
51 System.out.println( name );
52 }
53 }
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70 public static final boolean loadImageResource( String aFileName, IMAGE aOutImage, boolean aChangeToGrey)
71 {
72 if (aOutImage == null) return false;
73
74
75 BufferedImage img = null;
76 File imgFile = null;
77 try {
78 URL fileURL = Thread.currentThread().getContextClassLoader().getResource(aFileName);
79 imgFile = new File( fileURL.toURI() );
80 img = ImageIO.read( fileURL );
81 }
82 catch(IOException ex)
83 {
84 return false;
85 }
86 catch(URISyntaxException ex)
87 {
88 return false;
89 }
90
91 return postProcess(imgFile, img, aOutImage, aChangeToGrey);
92 }
93
94
95
96
97
98
99
100 public static final boolean loadImageFile( String aFileName, IMAGE aOutImage)
101 {
102 return loadImageFile( aFileName, aOutImage, false);
103 }
104
105
106
107
108
109
110
111
112
113
114
115
116
117 public static final boolean loadImageFile( String aFileName, IMAGE aOutImage, boolean aChangeToGrey)
118 {
119 if (aOutImage == null) return false;
120
121
122 BufferedImage img = null;
123 File imgFile = null;
124 try {
125 imgFile = new File( aFileName );
126 img = ImageIO.read( imgFile );
127 }
128 catch(IOException ex)
129 {
130 return false;
131 }
132
133 return postProcess(imgFile, img, aOutImage, aChangeToGrey);
134 }
135
136
137
138
139
140
141
142
143
144
145 private static final boolean postProcess(File imgFile, BufferedImage img, IMAGE aOutImage, boolean aChangeToGrey)
146 {
147
148
149 int imgWidth = img.getWidth();
150 int imgHeight = img.getHeight();
151
152 int[] pixelArr = new int[imgWidth*imgHeight];
153
154 if (img.getRGB(0,0,imgWidth, imgHeight, pixelArr, 0, imgWidth) == null)
155 return false;
156
157
158
159 IMAGE.FrameHeader frameHeader = aOutImage.getFrameHeader();
160 IMAGE.SourceHeader sourceHeader = aOutImage.getSourceHeader();
161
162 if (aChangeToGrey == true) {
163 frameHeader.bytesPerPixel = 1;
164 frameHeader.effectiveBitsPerPixel = 8;
165 frameHeader.imageFormat = (int) CVideoHeader3.CF_IMAGE_FORMAT_GRAY;
166 frameHeader.sourceFormat = (int) CVideoHeader3.CF_IMAGE_FORMAT_GRAY;
167 }
168 else
169 {
170
171 frameHeader.bytesPerPixel = 3;
172 frameHeader.effectiveBitsPerPixel = 24;
173 frameHeader.imageFormat = (int) CVideoHeader3.CF_IMAGE_FORMAT_RGB;
174 frameHeader.sourceFormat = (int) CVideoHeader3.CF_IMAGE_FORMAT_RGB;
175 }
176
177
178 frameHeader.appendedFrameSize = imgWidth*imgHeight*frameHeader.bytesPerPixel;
179
180 frameHeader.aoiHeight = -1;
181 frameHeader.aoiWidth = -1;
182
183 frameHeader.eventNumber = 0;
184 frameHeader.frameNumber = 0;
185 frameHeader.fspare1 = (float) -1.0;
186 frameHeader.fspare2 = (float) -1.0;
187 frameHeader.fspare3 = (float) -1.0;
188 frameHeader.horizontalBinning = 0;
189 frameHeader.imageFlags = (int) CVideoHeader3.CF_IMAGE_FLAG_IMAGE_LOSSLESS | (int) CVideoHeader3.CF_IMAGE_FLAG_LITTLE_ENDIAN_BYTE_ORDER;
190
191 frameHeader.imageRotation = (float) 0.0;
192 frameHeader.ispare1 = -1;
193 frameHeader.ispare2 = -1;
194 frameHeader.ispare3 = -1;
195 frameHeader.sourceHeight = imgHeight;
196 frameHeader.sourceWidth = imgWidth;
197 frameHeader.verticalBinning = 0;
198 frameHeader.xScale = (float) 1.000;
199 frameHeader.xStart = 0;
200 frameHeader.yScale = (float) 1.000;
201 frameHeader.yStart = 0;
202
203 sourceHeader.baseTag = (int) CVideoHeader3.CF_IMAGE_MAGIC_01;
204 sourceHeader.cameraPortName = "file://"+imgFile.getName(); // TODO: could be too long and truncated badly
205 sourceHeader.cameraPortId = (int) CVideoHeader3.CF_IMAGE_NO_CAMERA_PORT_ID;
206
207 long msTimeEpoch = imgFile.lastModified();
208 sourceHeader.timestampMicroseconds = (int) (((msTimeEpoch%((long)1000))*((long)1000)));
209 sourceHeader.timestampSeconds = (int) (((msTimeEpoch)/((long)1000)));
210
211 sourceHeader.totalLength = CVideoHeader3.HDRSIZE + frameHeader.appendedFrameSize;
212 sourceHeader.versionTag = CVideoHeader3.CF_IMAGE_VERSION;
213
214 byte[] buf = new byte[frameHeader.appendedFrameSize];
215
216
217
218
219 if (aChangeToGrey == true)
220 {
221 for (int i=0;i<frameHeader.sourceWidth*frameHeader.sourceHeight;i++)
222 {
223 double r = (double) ((pixelArr[i]>>16)&0xff);
224 double g = (double) ((pixelArr[i]>>8)&0xff);
225 double b = (double) (pixelArr[i]&0xff);
226 buf[i] = (byte) (0.114*b+0.587*g+0.299*r);
227 }
228 }
229 else
230 {
231 int pos = 0;
232 for (int i=0;i<frameHeader.sourceWidth*frameHeader.sourceHeight;i++)
233 {
234 buf[pos++] = (byte) ((pixelArr[i]>>16)&0xff);
235 buf[pos++] = (byte) ((pixelArr[i]>>8)&0xff);
236 buf[pos++] = (byte) (pixelArr[i]&0xff);
237 }
238 }
239
240 aOutImage.setImageFrameBuffer(buf);
241
242 return true;
243 }
244 }