1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 package org.openimaj.image.neardups.sim;
31
32 import java.io.ByteArrayInputStream;
33 import java.io.ByteArrayOutputStream;
34 import java.io.IOException;
35 import java.util.Iterator;
36
37 import javax.imageio.IIOImage;
38 import javax.imageio.ImageIO;
39 import javax.imageio.ImageWriteParam;
40 import javax.imageio.ImageWriter;
41 import javax.imageio.stream.MemoryCacheImageOutputStream;
42
43 import org.openimaj.image.ImageUtilities;
44 import org.openimaj.image.MBFImage;
45
46
47 public class CompressSimulation extends Simulation {
48 protected float minCompression = 0.1f;
49 protected float maxCompression = 1f;
50
51 public CompressSimulation(int seed) {
52 super(seed);
53 }
54
55 public CompressSimulation(int seed, float minCompression, float maxCompression) {
56 super(seed);
57 this.maxCompression = maxCompression;
58 this.minCompression = minCompression;
59 }
60
61 @Override
62 public MBFImage applySimulation(MBFImage input) {
63 try {
64 Iterator<ImageWriter> iter = ImageIO.getImageWritersByFormatName("jpeg");
65 ImageWriter writer = iter.next();
66 ImageWriteParam iwp = writer.getDefaultWriteParam();
67 iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
68
69 float compressionFactor = this.randomFloatInRange(minCompression, maxCompression);
70
71 iwp.setCompressionQuality(compressionFactor);
72
73 ByteArrayOutputStream output = new ByteArrayOutputStream();
74 writer.setOutput(new MemoryCacheImageOutputStream(output));
75
76 IIOImage image = new IIOImage(ImageUtilities.createBufferedImage(input), null, null);
77 writer.write(null, image, iwp);
78
79 return ImageUtilities.readMBF(new ByteArrayInputStream(output.toByteArray()));
80 } catch (IOException e) {
81 throw new Error(e);
82 }
83 }
84
85 }