Hi,
ich arbeite gerade an nem Bildbearbeitungsprogramm und musste feststellen, dass das Bearbeiten extrem ressourcen fressend sein kann. Kann doch nicht sein, dass es da nichts schnelleres gibt. Momentan meine beiden Hauptpbrobleme:
Skallieren
nachem ich die größe mit einem JSlider festlegen lasse, habe ich das ganze dann noch in nen Thread verpackt
Mein anderes Problem ist das verändern der RGB-Werte des Bildes
Der aufruf ist hier wieder genauso gehalten wie bei scalePic.
ich arbeite gerade an nem Bildbearbeitungsprogramm und musste feststellen, dass das Bearbeiten extrem ressourcen fressend sein kann. Kann doch nicht sein, dass es da nichts schnelleres gibt. Momentan meine beiden Hauptpbrobleme:
Skallieren
Code:
void scalePic() {
float xScale = 1F + (float)widthSkal.getValue() / 100F;
float yScale = 1F + (float)highSkal.getValue() / 100F;
Image img = curImg.getScaledInstance((int)(curImg.getWidth() * xScale), (int)(curImg.getHeight() * yScale), Image.SCALE_FAST);
shownImg = new BufferedImage((int)(curImg.getWidth() * xScale), (int)(curImg.getHeight() * yScale), BufferedImage.TYPE_INT_ARGB);
Graphics2D comp2D = shownImg.createGraphics();
comp2D.drawImage(img, 0, 0, null);
comp2D.dispose();
pic.setIcon(new ImageIcon(shownImg));
highTex.setText(String.valueOf(shownImg.getHeight()));
widthTex.setText(String.valueOf(shownImg.getWidth()));
validate();
repaint();
}
nachem ich die größe mit einem JSlider festlegen lasse, habe ich das ganze dann noch in nen Thread verpackt
Code:
else if (source == highSkal) {
if (bothSkal.isSelected()) {
widthSkal.setValue(highSkal.getValue());
}
if (work.isAlive()) {
work.interrupt();
}
work = new Thread(new Runnable() {
public void run() {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
scalePic();
}
});
}
});
work.start();
}
else if (source == widthSkal) {
if (bothSkal.isSelected()) {
highSkal.setValue(widthSkal.getValue());
}
if (work.isAlive()) {
work.interrupt();
}
work = new Thread(new Runnable() {
public void run() {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
scalePic();
}
});
}
});
work.start();
}
Mein anderes Problem ist das verändern der RGB-Werte des Bildes
Code:
void changeSliRGB() {
int[] rgbCols = new int[3];
boolean goOn = true;
Color col = null;
shownImg = new BufferedImage(curImg.getWidth(), curImg.getHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics2D comp2D = shownImg.createGraphics();
comp2D.drawImage(curImg, 0, 0, null);
comp2D.dispose();
for (int i = posX2; i < width + posX2; i++) {
for (int j = posY2; j < height + posY2; j++) {
goOn = true;
col = new Color(curImg.getRGB(i, j));
rgbCols[0] = col.getRed();
rgbCols[1] = col.getGreen();
rgbCols[2] = col.getBlue();
// der auskommentierte Teil dient dazu, wenn nur bestimmte Pixel bearbeitent werden sollen, ist also (erstmal) nicht wichtig
// if (rgbFiCb.getSelectedIndex() == 1) {
// if (rgbSeCb.getSelectedIndex() == 0) {
// if (rgbCols[1] > rgbCols[0] || rgbCols[2] > rgbCols[0]) {
// goOn = false;
// }
// }
// else if (rgbSeCb.getSelectedIndex() == 1) {
// if (rgbCols[0] > rgbCols[1] || rgbCols[2] > rgbCols[1]) {
// goOn = false;
// }
// }
// else {
// if (rgbCols[0] > rgbCols[2] || rgbCols[1] > rgbCols[2]) {
// goOn = false;
// }
// }
// }
// else if (rgbFiCb.getSelectedIndex() == 2) {
// MinMax Option durchlaufen
// for (int k = 0; k < 16; k += 4) {
// Soll feld beachten werden
// if (valsRGB[k + 2] != 256) {
// Minimal
// if (valsRGB[k + 1] == 0) {
// if (!(rgbCols[valsRGB[k]] >= rgbCols[valsRGB[k + 3]] + valsRGB[k + 2])) {
// goOn = false;
// break;
// }
// }
// Maximal
// else {
// if (!(rgbCols[valsRGB[k]] <= rgbCols[valsRGB[k + 3]] + valsRGB[k + 2])) {
// goOn = false;
// break;
// }
// }
// }
// }
// if (goOn == true) {
// Farbe liegt zwischen Berechnen
// for (int k = 17, l = 0; k < 22; k = k + 2, l++) {
// if (valsRGB[k] != 256 && valsRGB[k + 1] != 256) {
// if (!(rgbCols[l] <= valsRGB[k] && rgbCols[l] >= valsRGB[k + 1])) {
// goOn = false;
// break;
// }
// }
// }
// }
// }
if (goOn == true) {
if (erse[0].getSelectedIndex() == 0) {
rgbCols[0] += sliRed.getValue();
}
else {
rgbCols[0] = sliRed.getValue();
}
if (erse[1].getSelectedIndex() == 0) {
rgbCols[1] += sliGreen.getValue();
}
else {
rgbCols[1] = sliGreen.getValue();
}
if (erse[2].getSelectedIndex() == 0) {
rgbCols[2] += sliBlue.getValue();
}
else {
rgbCols[2] = sliBlue.getValue();
}
rgbCols[0] = ((rgbCols[0] > 255) ? 255 : ((rgbCols[0] < 0) ? 0 : rgbCols[0]));
rgbCols[1] = ((rgbCols[1] > 255) ? 255 : ((rgbCols[1] < 0) ? 0 : rgbCols[1]));
rgbCols[2] = ((rgbCols[2] > 255) ? 255 : ((rgbCols[2] < 0) ? 0 : rgbCols[2]));
col = new Color(rgbCols[0], rgbCols[1], rgbCols[2]);
shownImg.setRGB(i, j, col.getRGB());
}
}
}
pic.setIcon(new ImageIcon(shownImg));
}
Der aufruf ist hier wieder genauso gehalten wie bei scalePic.