Hallo zusammen!
EDIT: ACHTUNG: mittlerweile hab ich herausgefunden, dass es nicht an der Größe liegt, sondern am Verhältnis Höhe / Breite. Ist es nicht gleich, dann treten die Verschiebungen auf. Leider weiss ich nicht warum. So, weiter im Originaltext:
Ich habe einen Weichzeichner geschrieben, und ihn auf kleinen Bildern (512*512) getestet. Schien zu funktionieren:
auf größeren Bildern hab ich aber das Problem, dass er bestimmte Bereiche mit falschen Werten überlagert (man beachte die Desktopsymbole am folgendem Bild):
große Bilder, desshalb als Link:
http://img.photobucket.com/albums/v484/Thomas87/out_breit_3.jpg
http://img.photobucket.com/albums/v484/Thomas87/out_breit_5.jpg
Die beiden großen Bilder sind entsprechend ihrem Namen mit strenght = 3 bzw 5 gemacht worden.
Ich bin nicht Programmiersprachen - bewandert genug um rauszufinden, woran es liegt, sitze jetzt schon seit mehreren Stunden dran, hab diverse Sachen probiert, aber nichts will gelingen.
Hier der Code:
Es läuft also irgendwas mit den Variablen schief, allerdings weiss ich nicht, an welchen Variablen es scheitert, und weiss auch nicht, wie ich das rausfinden soll.
Wäre über jede Hilfe dankbar
MfG,
LMnd
EDIT: ACHTUNG: mittlerweile hab ich herausgefunden, dass es nicht an der Größe liegt, sondern am Verhältnis Höhe / Breite. Ist es nicht gleich, dann treten die Verschiebungen auf. Leider weiss ich nicht warum. So, weiter im Originaltext:
Ich habe einen Weichzeichner geschrieben, und ihn auf kleinen Bildern (512*512) getestet. Schien zu funktionieren:
auf größeren Bildern hab ich aber das Problem, dass er bestimmte Bereiche mit falschen Werten überlagert (man beachte die Desktopsymbole am folgendem Bild):
große Bilder, desshalb als Link:
http://img.photobucket.com/albums/v484/Thomas87/out_breit_3.jpg
http://img.photobucket.com/albums/v484/Thomas87/out_breit_5.jpg
Die beiden großen Bilder sind entsprechend ihrem Namen mit strenght = 3 bzw 5 gemacht worden.
Ich bin nicht Programmiersprachen - bewandert genug um rauszufinden, woran es liegt, sitze jetzt schon seit mehreren Stunden dran, hab diverse Sachen probiert, aber nichts will gelingen.
Hier der Code:
Code:
/*
* momentan wird noch auf dem Originalbild gearbeitet,
* dh der Filter beeinflusst sich selber im Bilddurchlauf.
* sinnvolle strenght Werte zum testen: ungerade Zahlen zwischen 3 und 11
*
*/
public class Weichzeichner extends Filter {
int hmax = BildLae; //Bildhöhe
int wmax = BildBre; //BildBreite
public Weichzeichner(Image im2){
super(im2);
}
//prüft, ob der Punkt mit den Koordinaten h,w im Bild ist
public boolean imBild (int h, int w){
boolean bool=false;
if (h>=0 && h<hmax && w>=0 && w<wmax) bool = true;
return bool;
}
public void weichzeichnen(int strenght){
//berechnet für die ungerade strenght Zahl die Mitte also zb 4 für 7
int mitte = (strenght - 1)/2;
//sum0 = Summe rot, sum1 = Summe Grün, sum2 = Summe Blau
int sum0, sum1, sum2;
//abstand 1: Abstand in Spalten vom Mittelpunkt mitte,mitte
//abstand 2: Abstand in Zeilen
int abstand1=0, abstand2=0;
//abstand = 1 + Summe der Abstände ... also gesammt-abstand
double abstand;
double z; //zähler
//zeilen, spalten durchlaufen
for (int h=0; h<hmax; h++){
for (int w=0; w<wmax; w++){
//z und sum0,sum1,sum2 bei jedem Durchlauf zurücksetzen
z = 0;
sum0 = sum1 = sum2 = 0;
//die strenght * strenght "Matrix" durchlaufen
for (int s1=1; s1<=strenght; s1++){
for (int s2=1; s2<=strenght; s2++){
//wenn Punkt im Bild, int "abstand" berechnen
if (imBild(h+mitte-s1,w+mitte-s2) == true){
if (s1<mitte) abstand1 = mitte-s1;
if (s1>mitte) abstand1 = s1-mitte;
if (s1==mitte) abstand1 = 0;
if (s2<mitte) abstand2 = mitte-s2;
if (s2>mitte) abstand2 = s2-mitte;
if (s2==mitte) abstand2 = 0;
abstand = abstand1 + abstand2 +1;
//zu z addieren, damit wir später wieder teilen können
//z ist nach Schleifenbeendigung die Summe der 1/Abstände
z=z + (1 / abstand);
//die RGB Werte entsprechend der Gewichtung 1/abstand addieren
sum0 = (int)(sum0 + im.getPixel(h+mitte-s1,w+mitte-s2,0)/abstand);
sum1 = (int)(sum1 + im.getPixel(h+mitte-s1,w+mitte-s2,1)/abstand);
sum2 = (int)(sum2 + im.getPixel(h+mitte-s1,w+mitte-s2,2)/abstand);
}
}
}
//den Pixel auf die oben berechnete, und entsprechend der
//Abstände korrigierte, Summe setzen
im.setPixel(h, w, 0, (short)(sum0/z));
im.setPixel(h, w, 1, (short)(sum1/z));
im.setPixel(h, w, 2, (short)(sum2/z));
}
}
}
}
Es läuft also irgendwas mit den Variablen schief, allerdings weiss ich nicht, an welchen Variablen es scheitert, und weiss auch nicht, wie ich das rausfinden soll.
Wäre über jede Hilfe dankbar
MfG,
LMnd
Zuletzt bearbeitet: