Wie kann man ein Bild rasterartig zerlegen und in einem GridLayout platzieren?
Das Auslesen des vorhandenen Bildes geschieht
folgendermaßen:
Die statische Methode read()
der Klasse ImageIO
liefert durch Auslesen
des File-Objektes des Dateipfades ein BufferedImage
.
Um Fehler beim Lesen abzufangen, muss dies innerhalb
eines try-catch-Blockes erfolgen.
Das Rastern des
Bildes erfolgt auf der Basis einer Variablen anz
,
die einerseits die Größe der gerasterten
Fläche selbst und andererseits die Aufteilung des
Bildes bestimmt: Sie legt die Anzahl der JLabel und die
rechteckige Gestaltung des GridLayouts des aufnehmenden
Containers, hier eines JPanel
, fest.
Das Zerlegen des BufferedImages erfolgt durch die
Methode BufferedImage.getSubimage()
. Sie
erwartet vier Parameter: die x- und y-Koordinaten der
linken oberen Ecke des jeweiligen Teilstückes,
sowie dessen Breite und Höhe. Die Zerlegung selbst
erfolgt in einer doppelten Schleife, in der
zunächst die Reihen und anschließend innerhalb
dieser die einzelnen Zellen definiert werden. Die
Methode gibt ein Image
-Objekt zurück,
das in ein ImageIcon
konvertiert wird. Das
kann schließlich einem der darstellenden JLabel
übergeben werden. Die JLabel selber werden
in init()
dem zentralen Container
gemäß dessen GridLayout
der Reihe
nach zugeteilt.
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class BildRastern {
private JPanel panel;
private JLabel[] labels;
private ImageIcon icon;
private String imgPath = "img/test.jpg";
private int anz = 4;
public BildRastern(){
init();
}
private void init() {
panel = new JPanel();
panel.setLayout(new GridLayout(anz, anz, 2, 2));
labels = new JLabel[anz * anz];
for (int i=0; i<labels.length; i++){
labels[i] = new JLabel();
panel.add(labels[i], BorderLayout.CENTER);
}
setImage();
JFrame frame = new JFrame("Bild rastern");
frame.add(panel, BorderLayout.CENTER);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
private BufferedImage loadImage(){
File imgFile = new File(imgPath);
BufferedImage buff = null;
try {
buff = ImageIO.read(imgFile);
} catch (IOException e) {
e.printStackTrace();
}
return buff;
}
private void setImage(){
BufferedImage bi = loadImage();
int width = bi.getWidth();
int height = bi.getHeight();
panel.setPreferredSize(new Dimension(width, height));
Image newImg;
int div = (int) Math.sqrt(labels.length);
int x=0, y=0, w=0, h=0;
for(int i=0; i<div; i++){
for(int j=0; j<div; j++){
w = width/div;
h = height/div;
x = j * w;
y = i * h;
newImg = bi.getSubimage(x, y, w, h);
icon = new ImageIcon(newImg);
labels[(i*div+j)].setIcon(icon);
}
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new BildRastern());
}
}
Wenn Ihnen javabeginners.de gefällt, freue ich mich über eine Spende an diese gemeinnützigen Organisationen.