1 package be
.nikiroo
.utils
.ui
;
3 import java
.awt
.geom
.AffineTransform
;
4 import java
.awt
.image
.AffineTransformOp
;
5 import java
.awt
.image
.BufferedImage
;
6 import java
.io
.ByteArrayInputStream
;
8 import java
.io
.IOException
;
9 import java
.io
.InputStream
;
11 import javax
.imageio
.ImageIO
;
13 import be
.nikiroo
.utils
.Image
;
14 import be
.nikiroo
.utils
.ImageUtils
;
17 * This class offer some utilities based around images and uses java.awt.
21 public class ImageUtilsAwt
extends ImageUtils
{
23 public void saveAsImage(Image img
, File target
, String format
)
26 BufferedImage image
= ImageUtilsAwt
.fromImage(img
);
31 ok
= ImageIO
.write(image
, format
, target
);
32 } catch (IOException e
) {
36 // Some formats are not reliable
38 if (!ok
&& !format
.equals("png")) {
39 ok
= ImageIO
.write(image
, "png", target
);
43 throw new IOException(
44 "Cannot find a writer for this image and format: "
47 } catch (IOException e
) {
48 throw new IOException("Cannot write image to " + target
, e
);
53 * Convert the given {@link Image} into a {@link BufferedImage} object,
54 * respecting the EXIF transformations if any.
59 * @return the {@link Image} object
64 static public BufferedImage
fromImage(Image img
) throws IOException
{
65 InputStream in
= new ByteArrayInputStream(img
.getData());
69 orientation
= getExifTransorm(in
);
70 } catch (Exception e
) {
71 // no EXIF transform, ok
76 BufferedImage image
= ImageIO
.read(in
);
79 throw new IOException("Failed to convert input to image");
82 // Note: this code has been found on Internet;
83 // thank you anonymous coder.
84 int width
= image
.getWidth();
85 int height
= image
.getHeight();
86 AffineTransform affineTransform
= new AffineTransform();
88 switch (orientation
) {
90 affineTransform
= null;
93 affineTransform
.scale(-1.0, 1.0);
94 affineTransform
.translate(-width
, 0);
96 case 3: // PI rotation
97 affineTransform
.translate(width
, height
);
98 affineTransform
.rotate(Math
.PI
);
101 affineTransform
.scale(1.0, -1.0);
102 affineTransform
.translate(0, -height
);
104 case 5: // - PI/2 and Flip X
105 affineTransform
.rotate(-Math
.PI
/ 2);
106 affineTransform
.scale(-1.0, 1.0);
108 case 6: // -PI/2 and -width
109 affineTransform
.translate(height
, 0);
110 affineTransform
.rotate(Math
.PI
/ 2);
112 case 7: // PI/2 and Flip
113 affineTransform
.scale(-1.0, 1.0);
114 affineTransform
.translate(-height
, 0);
115 affineTransform
.translate(0, width
);
116 affineTransform
.rotate(3 * Math
.PI
/ 2);
119 affineTransform
.translate(0, width
);
120 affineTransform
.rotate(3 * Math
.PI
/ 2);
123 affineTransform
= null;
127 if (affineTransform
!= null) {
128 AffineTransformOp affineTransformOp
= new AffineTransformOp(
129 affineTransform
, AffineTransformOp
.TYPE_BILINEAR
);
131 BufferedImage transformedImage
= new BufferedImage(width
, height
,
133 transformedImage
= affineTransformOp
134 .filter(image
, transformedImage
);
136 image
= transformedImage
;