Loading...
Searching...
No Matches
BitmapRegionDecoderExample.java
Go to the documentation of this file.
1package com.navigine.examples;
2
3import java.util.Arrays;
4import java.util.List;
5
11 private BitmapRegionDecoder decoder;
12 private byte[] imageData;
13
15 loadSampleImageData();
16 }
17
21 private void loadSampleImageData() {
22 // Simulate loading image data (in real app, this would be from file or network)
23 imageData = new byte[] {
24 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, // PNG header
25 // ... more image data would be here
26 };
27 System.out.println("Sample image data loaded (" + imageData.length + " bytes)");
28 }
29
34 if (imageData == null) {
35 System.err.println("No image data available");
36 return;
37 }
38
39 // [java_BitmapRegionDecoder_newInstance]
40 // Create new instance of BitmapRegionDecoder
41 decoder = BitmapRegionDecoder.newInstance(imageData);
42 System.out.println("Created BitmapRegionDecoder instance");
43 // [java_BitmapRegionDecoder_newInstance]
44
45 // Demonstrate rectangle creation and usage
47
48 // Demonstrate region decoding
50
51 // Demonstrate different sample sizes
53
54 // Demonstrate multiple regions
56 }
57
62 // [java_Rectangle_constructor]
63 // Create rectangle with x, y, width, height
64 Rectangle rect1 = new Rectangle(10, 20, 100, 150);
65 System.out.println("Created rectangle: x=" + rect1.getX() + ", y=" + rect1.getY() +
66 ", width=" + rect1.getWidth() + ", height=" + rect1.getHeight());
67 // [java_Rectangle_constructor]
68
69 // [java_Rectangle_getX]
70 // Get X coordinate
71 int x = rect1.getX();
72 System.out.println("Rectangle X coordinate: " + x);
73 // [java_Rectangle_getX]
74
75 // [java_Rectangle_getY]
76 // Get Y coordinate
77 int y = rect1.getY();
78 System.out.println("Rectangle Y coordinate: " + y);
79 // [java_Rectangle_getY]
80
81 // [java_Rectangle_getWidth]
82 // Get width
83 int width = rect1.getWidth();
84 System.out.println("Rectangle width: " + width);
85 // [java_Rectangle_getWidth]
86
87 // [java_Rectangle_getHeight]
88 // Get height
89 int height = rect1.getHeight();
90 System.out.println("Rectangle height: " + height);
91 // [java_Rectangle_getHeight]
92
93 // Create different rectangles for different use cases
94 Rectangle fullImage = new Rectangle(0, 0, 1024, 768);
95 Rectangle topLeft = new Rectangle(0, 0, 512, 384);
96 Rectangle center = new Rectangle(256, 192, 512, 384);
97 Rectangle bottomRight = new Rectangle(512, 384, 512, 384);
98
99 System.out.println("Created different rectangles for different regions");
100 }
101
106 if (decoder == null) {
107 System.err.println("Decoder not initialized");
108 return;
109 }
110
111 // Create a sample rectangle
112 Rectangle sampleRect = new Rectangle(50, 50, 200, 200);
113
114 // [java_BitmapRegionDecoder_decodeRegion]
115 // Decode region with sample size 1 (full resolution)
116 ImageWrapper decodedImage = decoder.decodeRegion(sampleRect, 1);
117 System.out.println("Decoded region: " + sampleRect.getWidth() + "x" + sampleRect.getHeight() + " at sample size 1");
118 // [java_BitmapRegionDecoder_decodeRegion]
119
120 // Demonstrate the decoded image
121 demonstrateDecodedImage(decodedImage, "Sample Region");
122 }
123
128 if (decoder == null) {
129 return;
130 }
131
132 Rectangle testRect = new Rectangle(0, 0, 400, 300);
133
134 // Decode with different sample sizes
135 List<Float> sampleSizes = Arrays.asList(1.0f, 2.0f, 4.0f, 8.0f);
136
137 for (float sampleSize : sampleSizes) {
138 // [java_BitmapRegionDecoder_decodeRegion_sampleSize]
139 // Decode region with specific sample size
140 ImageWrapper decodedImage = decoder.decodeRegion(testRect, sampleSize);
141 System.out.println("Decoded region with sample size " + sampleSize + ": " +
142 (int)(testRect.getWidth() / sampleSize) + "x" + (int)(testRect.getHeight() / sampleSize));
143 // [java_BitmapRegionDecoder_decodeRegion_sampleSize]
144
145 demonstrateDecodedImage(decodedImage, "Sample Size " + sampleSize);
146 }
147 }
148
153 if (decoder == null) {
154 return;
155 }
156
157 // Define multiple regions to decode
158 List<Rectangle> regions = Arrays.asList(
159 new Rectangle(0, 0, 256, 256), // Top-left quadrant
160 new Rectangle(256, 0, 256, 256), // Top-right quadrant
161 new Rectangle(0, 256, 256, 256), // Bottom-left quadrant
162 new Rectangle(256, 256, 256, 256) // Bottom-right quadrant
163 );
164
165 System.out.println("=== Decoding Multiple Regions ===");
166 for (int i = 0; i < regions.size(); i++) {
167 Rectangle region = regions.get(i);
168
169 // [java_BitmapRegionDecoder_decodeRegion_multiple]
170 // Decode multiple regions
171 ImageWrapper decodedImage = decoder.decodeRegion(region, 1);
172 System.out.println("Region " + (i + 1) + ": " + region.getWidth() + "x" + region.getHeight() +
173 " at (" + region.getX() + ", " + region.getY() + ")");
174 // [java_BitmapRegionDecoder_decodeRegion_multiple]
175
176 demonstrateDecodedImage(decodedImage, "Region " + (i + 1));
177 }
178 }
179
183 public void demonstrateDecodedImage(ImageWrapper image, String description) {
184 System.out.println("--- " + description + " ---");
185 System.out.println("Image dimensions: " + image.getWidth() + "x" + image.getHeight());
186 System.out.println("Image format: " + image.getFormat());
187 System.out.println("Image data size: " + image.getData().length + " bytes");
188 System.out.println("---");
189 }
190
195 System.out.println("=== Advanced BitmapRegionDecoder Features ===");
196
197 if (imageData == null) {
198 return;
199 }
200
201 // Create multiple decoders for different images
202 List<byte[]> imageDataList = Arrays.asList(
203 imageData,
204 new byte[] { (byte) 0xFF, (byte) 0xD8, (byte) 0xFF, (byte) 0xE0 }, // JPEG header
205 new byte[] { 0x47, 0x49, 0x46, 0x38 } // GIF header
206 );
207
208 for (int i = 0; i < imageDataList.size(); i++) {
209 try {
210 // [java_BitmapRegionDecoder_newInstance_advanced]
211 // Create decoder for different image types
212 BitmapRegionDecoder decoder = BitmapRegionDecoder.newInstance(imageDataList.get(i));
213 System.out.println("Created decoder for image type " + (i + 1));
214 // [java_BitmapRegionDecoder_newInstance_advanced]
215
216 // Test decoding with different regions
217 Rectangle testRect = new Rectangle(0, 0, 100, 100);
218 ImageWrapper decodedImage = decoder.decodeRegion(testRect, 1);
219 System.out.println("Successfully decoded region from image type " + (i + 1));
220
221 } catch (Exception e) {
222 System.err.println("Failed to decode image type " + (i + 1) + ": " + e.getMessage());
223 }
224 }
225 }
226
231 System.out.println("=== Error Handling ===");
232
233 // Test with invalid image data
234 byte[] invalidData = new byte[] { 0x00, 0x01, 0x02, 0x03 };
235
236 try {
237 // [java_BitmapRegionDecoder_newInstance_error]
238 // Create decoder with invalid data
239 BitmapRegionDecoder decoder = BitmapRegionDecoder.newInstance(invalidData);
240 System.out.println("Created decoder with invalid data");
241 // [java_BitmapRegionDecoder_newInstance_error]
242
243 // Try to decode region
244 Rectangle rect = new Rectangle(0, 0, 50, 50);
245 ImageWrapper image = decoder.decodeRegion(rect, 1);
246 System.out.println("Successfully decoded region from invalid data");
247
248 } catch (Exception e) {
249 System.out.println("Expected error when creating decoder with invalid data: " + e.getMessage());
250 }
251
252 // Test with invalid rectangle
253 if (decoder != null) {
254 try {
255 Rectangle invalidRect = new Rectangle(-10, -10, 100, 100);
256 ImageWrapper image = decoder.decodeRegion(invalidRect, 1);
257 System.out.println("Successfully decoded region with negative coordinates");
258
259 } catch (Exception e) {
260 System.out.println("Expected error with invalid rectangle: " + e.getMessage());
261 }
262 }
263 }
264
269 System.out.println("=== Performance Optimization ===");
270
271 if (decoder == null) {
272 return;
273 }
274
275 // Test different sample sizes for performance
276 Rectangle largeRect = new Rectangle(0, 0, 800, 600);
277 List<Float> sampleSizes = Arrays.asList(1.0f, 2.0f, 4.0f, 8.0f, 16.0f);
278
279 for (float sampleSize : sampleSizes) {
280 long startTime = System.currentTimeMillis();
281
282 ImageWrapper image = decoder.decodeRegion(largeRect, sampleSize);
283
284 long endTime = System.currentTimeMillis();
285 System.out.println("Sample size " + sampleSize + ": " + (endTime - startTime) + "ms, " +
286 "Output size: " + image.getWidth() + "x" + image.getHeight());
287 }
288 }
289
294 System.out.println("=== Rectangle Manipulation ===");
295
296 // Create base rectangle
297 Rectangle baseRect = new Rectangle(100, 100, 200, 150);
298 System.out.println("Base rectangle: " + baseRect.getX() + ", " + baseRect.getY() +
299 ", " + baseRect.getWidth() + "x" + baseRect.getHeight());
300
301 // Create different variations
302 List<Rectangle> variations = Arrays.asList(
303 new Rectangle(baseRect.getX(), baseRect.getY(), baseRect.getWidth() / 2, baseRect.getHeight()), // Half width
304 new Rectangle(baseRect.getX(), baseRect.getY(), baseRect.getWidth(), baseRect.getHeight() / 2), // Half height
305 new Rectangle(baseRect.getX() + 50, baseRect.getY() + 25, baseRect.getWidth() - 100, baseRect.getHeight() - 50), // Centered smaller
306 new Rectangle(0, 0, baseRect.getWidth(), baseRect.getHeight()) // Top-left aligned
307 );
308
309 for (int i = 0; i < variations.size(); i++) {
310 Rectangle rect = variations.get(i);
311 System.out.println("Variation " + (i + 1) + ": " + rect.getX() + ", " + rect.getY() +
312 ", " + rect.getWidth() + "x" + rect.getHeight());
313 }
314 }
315
319 public void runExample() {
320 System.out.println("=== BitmapRegionDecoder Example ===");
321
327
328 // Wait a bit for processing
329 try {
330 Thread.sleep(2000);
331 } catch (InterruptedException e) {
332 Thread.currentThread().interrupt();
333 }
334
335 System.out.println("=== Example completed ===");
336 }
337
341 public static void main(String[] args) {
343 example.runExample();
344 }
345}