Ahoj, potřeboval bych poradit s jedním projektem do školy. Jedná se o program na zpracování a úpravu obrázků a přestože v mnoha ohledech funguje tak, jak má, vždy, když se rozhodnu programovat, narazím na nějakej totální renonc.
První problém je spíš teoretický - mám funkci load, která načte obrázek a následně jej má zobrazit. Na každém stroji se to ale chová jinak - buď obrázek vůbec nezobrazí, nebo jej zobrazí po minimalizaci a obnovení okna. Následně buď zamrzne na původním načteném obrázku, nebo zobrazuje všechny úpravy. Vím, že je tam nejspíš problém s verzí javy, nicméně dá-li se tomu nějakým způsobem vyhnout a udělat program v tomhle ohledu konzistentní, byl bych vděčný za každou radu.
Druhý problém mám s rotací obrázku. Zde přikládám kód:
private void jMenuItem7ActionPerformed(java.awt.event.ActionEvent evt) {
int w = twitchPic.getWidth();
int h = twitchPic.getHeight();
BufferedImage rotate = new BufferedImage(h, w, BufferedImage.TYPE_INT_RGB);
AffineTransform at = AffineTransform.getRotateInstance(Math.PI/2, w / 2, h / 2);
Graphics2D g = (Graphics2D) rotate.createGraphics();
g.drawImage(twitchPic, at, null);
g.dispose();
twitchPic = rotate;
actions.add("CW");
}
Tato funkce totiž obrázek nejen orotuje, ale zároveň jej ořízne. Chyba by tedy měla být v rozměrech orotovaného obrázku, nicméně ty vypadají správně.
Dále pracuji na barevných módech pro obrázek - normální a greyscale. Převádím to na HSV a upravuji saturaci. Kód:
private void jMenuItem9ActionPerformed(java.awt.event.ActionEvent evt) {
if(actions.contains("normal")){
System.err.println("this picture is already in normal mode");
}
for(int i=0; i<twitchPic.getWidth(); i++) {
for(int j=0; j<twitchPic.getHeight(); j++) {
int r = new Color(twitchPic.getRGB(i, j)).getRed();
int g = new Color(twitchPic.getRGB(i, j)).getGreen();
int b = new Color(twitchPic.getRGB(i, j)).getBlue();
float[] hsv = new float[3];
Color.RGBtoHSB(r,g,b,hsv);
hsv[1] = (float) 1.0;
twitchPic.setRGB(i,j,Color.HSBtoRGB(hsv[0],hsv[1],hsv[2]));
}
}
for(int k=0; k<actions.size()-1;k++){
if(actions.get(k).equals("greyscale")){
actions.remove(k);
}
}
actions.add("normal");
}
U greyscale mám v HSV[1] hodnotu 0.0 a pracuje to v pořádku. Když ale dám v normálním módu do HSV[1] hodnotu 1.1, získám místo normální saturace prakticky červený filtr. Čím je to způsobeno? Hue a Value by měly být stejné (pokud jsem nic nepřehlédl) a saturace přeci operuje jen s tmavostí barvy...
Mám taky funkci na reset všech úprav na daném obrázku tím, že jej znova načtu:
private void jMenuItem11ActionPerformed(java.awt.event.ActionEvent evt) {
Graphics gr = openedPic.getGraphics();
paint(gr);
twitchPic = openedPic;
actions.clear();
deleted = null;
}
problém je, že to udělá tento pro mne totálně nepochopitelný glitch:
Poslední ještě nemám naimplementovaný, ale chtěl bych přidat filtry např. na rozmazání nebo zaostření
public static final float[] SHARPEN = {
0.f, -1.f, 0.f,
-1.f, 5.f, -1.f,
0.f, -1.f, 0.f
};
I přes teoretickou znalost ale nemůžu přijít na to, jak správně zapsat patřičný for cyklus, který by takový filtr na jednotlivé pixely aplikoval.
Já vím, je toho hodně, ale za každou pomoc bych byl opravdu neskonale vděčný.