Loading...
Searching...
No Matches
BitmapRegionDecoderExample.java
Go to the documentation of this file.
1package com.navigine.examples;
2
3import com.navigine.idl.java.BitmapRegionDecoder;
4import com.navigine.idl.java.Image;
5
6import java.util.Arrays;
7import java.util.List;
8
14 private BitmapRegionDecoder decoder;
15 private byte[] imageData;
16
18 loadSampleImageData();
19 }
20
24 private void loadSampleImageData() {
25 // Simulate loading image data (in real app, this would be from file or network)
26 imageData = new byte[] {
27 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, // PNG header
28 // ... more image data would be here
29 };
30 System.out.println("Sample image data loaded (" + imageData.length + " bytes)");
31 }
32
37 if (imageData == null) {
38 System.err.println("No image data available");
39 return;
40 }
41
42 // [java_BitmapRegionDecoder_newInstance]
43 // Create new instance of BitmapRegionDecoder
44 decoder = BitmapRegionDecoder.newInstance(imageData);
45 System.out.println("Created BitmapRegionDecoder instance");
46 // [java_BitmapRegionDecoder_newInstance]
47
48 // [java_BitmapRegionDecoder_newInstanceFromImage]
49 // When you already have an Image (e.g. from SDK), create decoder without passing raw bytes again
50 Image imageForDecoder = null; // set from your pipeline when available
51 BitmapRegionDecoder decoderFromImage = BitmapRegionDecoder.newInstanceFromImage(imageForDecoder);
52 System.out.println("Decoder from Image: " + (decoderFromImage != null));
53 // [java_BitmapRegionDecoder_newInstanceFromImage]
54
55 // [java_BitmapRegionDecoder_getWidth]
56 int sourceWidth = decoder.getWidth();
57 System.out.println("Source image width: " + sourceWidth);
58 // [java_BitmapRegionDecoder_getWidth]
59
60 // [java_BitmapRegionDecoder_getHeight]
61 int sourceHeight = decoder.getHeight();
62 System.out.println("Source image height: " + sourceHeight);
63 // [java_BitmapRegionDecoder_getHeight]
64
65 // Demonstrate rectangle creation and usage
67
68 // Demonstrate region decoding
70
71 // Demonstrate different sample sizes
73
74 // Demonstrate multiple regions
76 }
77
82 // [java_Rectangle_constructor]
83 // Create rectangle with x, y, width, height
84 Rectangle rect1 = new Rectangle(10, 20, 100, 150);
85 System.out.println("Created rectangle: x=" + rect1.getX() + ", y=" + rect1.getY() +
86 ", width=" + rect1.getWidth() + ", height=" + rect1.getHeight());
87 // [java_Rectangle_constructor]
88
89 // [java_Rectangle_getX]
90 // Get X coordinate
91 int x = rect1.getX();
92 System.out.println("Rectangle X coordinate: " + x);
93 // [java_Rectangle_getX]
94
95 // [java_Rectangle_getY]
96 // Get Y coordinate
97 int y = rect1.getY();
98 System.out.println("Rectangle Y coordinate: " + y);
99 // [java_Rectangle_getY]
100
101 // [java_Rectangle_getWidth]
102 // Get width
103 int width = rect1.getWidth();
104 System.out.println("Rectangle width: " + width);
105 // [java_Rectangle_getWidth]
106
107 // [java_Rectangle_getHeight]
108 // Get height
109 int height = rect1.getHeight();
110 System.out.println("Rectangle height: " + height);
111 // [java_Rectangle_getHeight]
112
113 // Create different rectangles for different use cases
114 Rectangle fullImage = new Rectangle(0, 0, 1024, 768);
115 Rectangle topLeft = new Rectangle(0, 0, 512, 384);
116 Rectangle center = new Rectangle(256, 192, 512, 384);
117 Rectangle bottomRight = new Rectangle(512, 384, 512, 384);
118
119 System.out.println("Created different rectangles for different regions");
120 }
121
126 if (decoder == null) {
127 System.err.println("Decoder not initialized");
128 return;
129 }
130
131 // Create a sample rectangle
132 Rectangle sampleRect = new Rectangle(50, 50, 200, 200);
133
134 // [java_BitmapRegionDecoder_decodeRegion]
135 // Decode region with sample size 1 (full resolution)
136 ImageWrapper decodedImage = decoder.decodeRegion(sampleRect, 1);
137 System.out.println("Decoded region: " + sampleRect.getWidth() + "x" + sampleRect.getHeight() + " at sample size 1");
138 // [java_BitmapRegionDecoder_decodeRegion]
139
140 // Demonstrate the decoded image
141 demonstrateDecodedImage(decodedImage, "Sample Region");
142 }
143
148 if (decoder == null) {
149 return;
150 }
151
152 Rectangle testRect = new Rectangle(0, 0, 400, 300);
153
154 // Decode with different sample sizes
155 List<Float> sampleSizes = Arrays.asList(1.0f, 2.0f, 4.0f, 8.0f);
156
157 for (float sampleSize : sampleSizes) {
158 // [java_BitmapRegionDecoder_decodeRegion_sampleSize]
159 // Decode region with specific sample size
160 ImageWrapper decodedImage = decoder.decodeRegion(testRect, sampleSize);
161 System.out.println("Decoded region with sample size " + sampleSize + ": " +
162 (int)(testRect.getWidth() / sampleSize) + "x" + (int)(testRect.getHeight() / sampleSize));
163 // [java_BitmapRegionDecoder_decodeRegion_sampleSize]
164
165 demonstrateDecodedImage(decodedImage, "Sample Size " + sampleSize);
166 }
167 }
168
173 if (decoder == null) {
174 return;
175 }
176
177 // Define multiple regions to decode
178 List<Rectangle> regions = Arrays.asList(
179 new Rectangle(0, 0, 256, 256), // Top-left quadrant
180 new Rectangle(256, 0, 256, 256), // Top-right quadrant
181 new Rectangle(0, 256, 256, 256), // Bottom-left quadrant
182 new Rectangle(256, 256, 256, 256) // Bottom-right quadrant
183 );
184
185 System.out.println("=== Decoding Multiple Regions ===");
186 for (int i = 0; i < regions.size(); i++) {
187 Rectangle region = regions.get(i);
188
189 // [java_BitmapRegionDecoder_decodeRegion_multiple]
190 // Decode multiple regions
191 ImageWrapper decodedImage = decoder.decodeRegion(region, 1);
192 System.out.println("Region " + (i + 1) + ": " + region.getWidth() + "x" + region.getHeight() +
193 " at (" + region.getX() + ", " + region.getY() + ")");
194 // [java_BitmapRegionDecoder_decodeRegion_multiple]
195
196 demonstrateDecodedImage(decodedImage, "Region " + (i + 1));
197 }
198 }
199
203 public void demonstrateDecodedImage(ImageWrapper image, String description) {
204 System.out.println("--- " + description + " ---");
205 System.out.println("Image dimensions: " + image.getWidth() + "x" + image.getHeight());
206 System.out.println("Image format: " + image.getFormat());
207 System.out.println("Image data size: " + image.getData().length + " bytes");
208 System.out.println("---");
209 }
210
215 System.out.println("=== Advanced BitmapRegionDecoder Features ===");
216
217 if (imageData == null) {
218 return;
219 }
220
221 // Create multiple decoders for different images
222 List<byte[]> imageDataList = Arrays.asList(
223 imageData,
224 new byte[] { (byte) 0xFF, (byte) 0xD8, (byte) 0xFF, (byte) 0xE0 }, // JPEG header
225 new byte[] { 0x47, 0x49, 0x46, 0x38 } // GIF header
226 );
227
228 for (int i = 0; i < imageDataList.size(); i++) {
229 try {
230 // [java_BitmapRegionDecoder_newInstance_advanced]
231 // Create decoder for different image types
232 BitmapRegionDecoder decoder = BitmapRegionDecoder.newInstance(imageDataList.get(i));
233 System.out.println("Created decoder for image type " + (i + 1));
234 // [java_BitmapRegionDecoder_newInstance_advanced]
235
236 // Test decoding with different regions
237 Rectangle testRect = new Rectangle(0, 0, 100, 100);
238 ImageWrapper decodedImage = decoder.decodeRegion(testRect, 1);
239 System.out.println("Successfully decoded region from image type " + (i + 1));
240
241 } catch (Exception e) {
242 System.err.println("Failed to decode image type " + (i + 1) + ": " + e.getMessage());
243 }
244 }
245 }
246
251 System.out.println("=== Error Handling ===");
252
253 // Test with invalid image data
254 byte[] invalidData = new byte[] { 0x00, 0x01, 0x02, 0x03 };
255
256 try {
257 // [java_BitmapRegionDecoder_newInstance_error]
258 // Create decoder with invalid data
260 System.out.println("Created decoder with invalid data");
261 // [java_BitmapRegionDecoder_newInstance_error]
262
263 // Try to decode region
264 Rectangle rect = new Rectangle(0, 0, 50, 50);
265 ImageWrapper image = decoder.decodeRegion(rect, 1);
266 System.out.println("Successfully decoded region from invalid data");
267
268 } catch (Exception e) {
269 System.out.println("Expected error when creating decoder with invalid data: " + e.getMessage());
270 }
271
272 // Test with invalid rectangle
273 if (decoder != null) {
274 try {
275 Rectangle invalidRect = new Rectangle(-10, -10, 100, 100);
276 ImageWrapper image = decoder.decodeRegion(invalidRect, 1);
277 System.out.println("Successfully decoded region with negative coordinates");
278
279 } catch (Exception e) {
280 System.out.println("Expected error with invalid rectangle: " + e.getMessage());
281 }
282 }
283 }
284
289 System.out.println("=== Performance Optimization ===");
290
291 if (decoder == null) {
292 return;
293 }
294
295 // Test different sample sizes for performance
296 Rectangle largeRect = new Rectangle(0, 0, 800, 600);
297 List<Float> sampleSizes = Arrays.asList(1.0f, 2.0f, 4.0f, 8.0f, 16.0f);
298
299 for (float sampleSize : sampleSizes) {
300 long startTime = System.currentTimeMillis();
301
302 ImageWrapper image = decoder.decodeRegion(largeRect, sampleSize);
303
304 long endTime = System.currentTimeMillis();
305 System.out.println("Sample size " + sampleSize + ": " + (endTime - startTime) + "ms, " +
306 "Output size: " + image.getWidth() + "x" + image.getHeight());
307 }
308 }
309
314 System.out.println("=== Rectangle Manipulation ===");
315
316 // Create base rectangle
317 Rectangle baseRect = new Rectangle(100, 100, 200, 150);
318 System.out.println("Base rectangle: " + baseRect.getX() + ", " + baseRect.getY() +
319 ", " + baseRect.getWidth() + "x" + baseRect.getHeight());
320
321 // Create different variations
322 List<Rectangle> variations = Arrays.asList(
323 new Rectangle(baseRect.getX(), baseRect.getY(), baseRect.getWidth() / 2, baseRect.getHeight()), // Half width
324 new Rectangle(baseRect.getX(), baseRect.getY(), baseRect.getWidth(), baseRect.getHeight() / 2), // Half height
325 new Rectangle(baseRect.getX() + 50, baseRect.getY() + 25, baseRect.getWidth() - 100, baseRect.getHeight() - 50), // Centered smaller
326 new Rectangle(0, 0, baseRect.getWidth(), baseRect.getHeight()) // Top-left aligned
327 );
328
329 for (int i = 0; i < variations.size(); i++) {
330 Rectangle rect = variations.get(i);
331 System.out.println("Variation " + (i + 1) + ": " + rect.getX() + ", " + rect.getY() +
332 ", " + rect.getWidth() + "x" + rect.getHeight());
333 }
334 }
335
339 public void runExample() {
340 System.out.println("=== BitmapRegionDecoder Example ===");
341
347
348 // Wait a bit for processing
349 try {
350 Thread.sleep(2000);
351 } catch (InterruptedException e) {
352 Thread.currentThread().interrupt();
353 }
354
355 System.out.println("=== Example completed ===");
356 }
357
361 public static void main(String[] args) {
363 example.runExample();
364 }
365}