Konwersja Image Base64
Zdarza się czasem, że musimy zapisać na dysku jakąś, wybraną grafikę. O ile możemy zapisać ją w osobnym pliku, nie ma z tym problemu. Inaczej ma się sprawa, gdy chcemy zapisać grafikę w zbiorczym pliku konfiguracyjnym. W takiej sytuacji do problemu można podejść na dwa sposoby:
-
Zapisać grafikę w osobnym pliku, a w pliku konfiguracyjnym zapisać ścieżkę do grafiki.
-
Zapisać grafikę bezpośrednio w pliku konfiguracyjnym.
Poniżej przedstawię moje podejście do drugiego z wymienionych przypadków.
W jednej z tworzonych przeze mnie aplikacji pojawiła się konieczność dania użytkownikowi możliwości wybrania grafiki oraz zapisania jej w pliku konfiguracyjnym programu. Jako, że wykorzystywany w aplikacji XMLConfiguration z Apache’owych commons’ów nie daje mi takiej możliwości, doszedłem do wniosku, że najprościej będzie skonwertować posiadany Image do postaci Base64, aby ładnie dało się go zapisać w konfiguracji, ale jako String’a. Oto, co mi z tego wyszło:
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
35
36
37
38
39
40
public void setImage(Image image) throws IOException {
if (image == null) {
conf.setProperty(IMAGE_KEY, IMAGE_DEFAULT_VALUE);
} else {
image = new ImageIcon(image).getImage();
final ByteArrayOutputStream os = new ByteArrayOutputStream();
ImageIO.write(((ToolkitImage) image).getBufferedImage(), "png", os);
final String imageBase64 = Base64.encode(os.toByteArray());
conf.setProperty(IMAGE_KEY, imageBase64);
}
}
public Boolean isImageSelected() {
final String imageBase64 = conf.getString(IMAGE_KEY, IMAGE_DEFAULT_VALUE);
if(StringUtils.isNotBlank(imageBase64)) {
return Boolean.TRUE;
} else {
return Boolean.FALSE;
}
}
public Image getImage() throws IOException {
final String imageBase64 = conf.getString(IMAGE_KEY, IMAGE_DEFAULT_VALUE);
if (imageBase64 == null) {
return null;
}
final byte[] imageBytes = Base64.decode(imageBase64);
final Image image = Toolkit.getDefaultToolkit().createImage(imageBytes);
return new ImageIcon(image).getImage();
}