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
31
32
33
34 package info.magnolia.ui.mediaeditor.field.image;
35
36 import info.magnolia.ui.vaadin.editor.JCropField;
37 import info.magnolia.ui.vaadin.gwt.shared.jcrop.SelectionArea;
38
39 import java.awt.image.BufferedImage;
40 import java.io.ByteArrayInputStream;
41 import java.io.IOException;
42
43 import javax.imageio.ImageIO;
44
45 import org.slf4j.Logger;
46 import org.slf4j.LoggerFactory;
47
48 import com.jhlabs.image.CropFilter;
49 import com.vaadin.ui.Component;
50
51
52
53
54 public class CropField extends ImageMediaField {
55 private static final Logger log = LoggerFactory.getLogger(CropField.class);
56
57 private final static int DEFAULT_CROP_OFFSET = 50;
58
59 private final static int DEFAULT_CROP_DIMENSION = 200;
60
61 private SelectionArea selectedArea = null;
62
63 private JCropField jcropField = new JCropField();
64
65 private BufferedImage image;
66
67 public CropField() {
68 jcropField.addValueChangeListener(event -> selectedArea = event.getValue());
69 }
70
71 @Override
72 protected Component createImage() {
73 return jcropField;
74 }
75
76 @Override
77 public void refreshImageSource() {
78 try {
79 image = ImageIO.read(new ByteArrayInputStream(getValue()));
80 jcropField.setTrueHeight(image.getHeight());
81 jcropField.setTrueWidth(image.getWidth());
82 jcropField.setImageSource(createResourceFromValue());
83 jcropField.select(new SelectionArea(
84 DEFAULT_CROP_OFFSET,
85 DEFAULT_CROP_OFFSET,
86 DEFAULT_CROP_DIMENSION,
87 DEFAULT_CROP_DIMENSION));
88 } catch (IOException e) {
89 log.error("Error reading the image data: " + e.getMessage(), e);
90 }
91 }
92
93 public BufferedImage cropImage(SelectionArea area) throws IOException {
94 final CropFilter cropFilter = new CropFilter();
95 cropFilter.setX(area.getLeft());
96 cropFilter.setY(area.getTop());
97 cropFilter.setWidth(area.getWidth());
98 cropFilter.setHeight(area.getHeight());
99 return cropFilter.filter(image, null);
100 }
101
102 public void setStatusComponent(Component c) {
103 jcropField.setStatusComponent(c);
104 }
105
106 @Override
107 protected BufferedImage executeImageModification() throws IOException {
108 return (selectedArea != null) ? cropImage(selectedArea) : null;
109 }
110 }