RGB-Frabmodell filtern

Status
Nicht offen für weitere Antworten.

disart

Mitglied
hallo,

hab mal wieder ein problem bei einer java aufgabe.
ich soll ein rgb .gif bild mit bestimmten filter algorithmen bearbeiten.

wie z.b. vertauschen von rot- und blau- anteilen im bild.
das funktioniert auch alles. probleme hab ich bei folgenden aufgaben:
- stellen sie nur dunkle bzw. helle stellen des bilde dar
- können sie das bild etwas aufhellen (unter umständen nur die blau töne)
- versuchen sie eine darstellung in schwarz-weiß (grauwert hab ich geschafft)

so sieht meine methode bis jetzt aus:
Code:
class TestFilter extends RGBImageFilter {
  
    public int filterRGB(int x, int y, int pixel) {
        int filteredPixel;
        int pixel1;
        int pixel2;
        int pixel3;
        int getauscht;
       
        
        // filtern von grün, blau, rot
  	    //filteredPixel = (pixel & 0xff00ff00); // grün
  	    //filteredPixel = (pixel & 0xff0000ff); // blau
  	    //filteredPixel = (pixel & 0xffff0000); // rot
        
        
        
        // farbe eigener wahl anstreichen
        //filteredPixel = (0xff00ff00); // färbt bild in beliebiger farbe ein
        //filteredPixel = (pixel & 0xffffffff);
        //return filteredPixel;  
        
           
               
        // rot blau vertauschen
   /*   pixel1 = pixel >> 16 & 0xff0000ff;
        pixel2 = pixel << 16 & 0xffff0000;
        filteredPixel = (pixel & 0xff00ff00);
        getauscht = (pixel2 | pixel1 | filteredPixel );
                        
        return getauscht;
    */
        
        
        // bild mit grauwerten
   /*   pixel1 = pixel >> 16 & 0xff0000ff;
        pixel2 = pixel >> 8 & 0xff00ff00;
        filteredPixel = (pixel & 0xffff0000);
        getauscht = (pixel1 | pixel2 | filteredPixel );
        
        return getauscht;
     */   
        
    }
}



vielleicht kann mir ja jemand helfen.
 
S

SlaterB

Gast
eine feste Definition für die geforderten Sachen gibts wohl nicht,

mach dir ne Mitte und dann gibt bei höheren Pixeln schwarz, bei niedrigeren weiß zurück,
bzw. gib bei niedrigenen die Original zurück, bei höheren aber einen weißen Wert (oder umgekehrt),
bzw. erhöhe nur den Blau-Anteil um 20% (des verbleibenen Intervalls bis zum Maximalwert)

könntest du den restlichen Code (Einlesen, auf die einzelnen Pixel zugreifen, speichern) noch grob dazuposten?
interessiert mich auch
 

disart

Mitglied
so in der art dachte ich es mir auch,
die frage ist aber wie ich das machen muss.

hier der komplette code:
da ich noch änfänger bin, kann ich mit dem ganzen nichts anfangen, für mich ist also nur die unterste klasse interessant.
Code:
import java.awt.*;
import java.awt.image.*;
import javax.swing.*;

public class photohop {
    public static void main(String[] args) {
        Toolkit toolkit = Toolkit.getDefaultToolkit();
        Image srcImage = toolkit.getImage("river.gif");
	
        ImageFilter colorfilter = new TestFilter();
        Image filteredImage = toolkit.createImage(
            new FilteredImageSource(srcImage.getSource(),colorfilter));
        JFrame srcFrame = new DisplayFrame(srcImage,0,0,500,200);
        JFrame filteredFrame = new DisplayFrame(filteredImage,0, 200, 500, 200);
    
        filteredFrame.setBackground(Color.red);  


        Image srcImage2 = toolkit.getImage("farbenkreis_b.gif");
	
        Image filteredImage2 = toolkit.createImage(
            new FilteredImageSource(srcImage2.getSource(),colorfilter));
        JFrame srcFrame2 = new DisplayFrame(srcImage2, 500, 0, 200, 200);
        JFrame filteredFrame2 = new DisplayFrame(filteredImage2, 500, 200, 200, 200);

        filteredFrame2.setBackground(Color.red);              
     }
}

class DisplayFrame extends JFrame  {
    private Image image;
    int x,y,b,h;

    public DisplayFrame(Image image, int x, int y, int b, int h)  {
        this.image = image;
        this.x = x;
        this.y = y;
        this.b = b;
        this.h = h;
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setBounds(x,y,b,h);
        this.setVisible(true);
    }
    
    public void paint(Graphics g) {    
        g.drawImage(image, 0, 0,b, h, this); 
    }
}
    
    

class TestFilter extends RGBImageFilter {
  
    public int filterRGB(int x, int y, int pixel) {
        int filteredPixel;
        int pixel1;
        int pixel2;
        int pixel3;
        int getauscht;
       
        
        // aufgabe a
  	    //filteredPixel = (pixel & 0xff00ff00); // grün
  	    //filteredPixel = (pixel & 0xff0000ff); // blau
  	    //filteredPixel = (pixel & 0xffff0000); // rot
        
        
        
        // aufgabe b
        //filteredPixel = (0xff00ff00); // färbt bild in beliebiger farbe ein
        //filteredPixel = (pixel & 0xffffffff);
        //return filteredPixel;  
        
           
               
        // aufgabe c
   /*   pixel1 = pixel >> 16 & 0xff0000ff;
        pixel2 = pixel << 16 & 0xffff0000;
        filteredPixel = (pixel & 0xff00ff00);
        getauscht = (pixel2 | pixel1 | filteredPixel );
                        
        return getauscht;
    */
        
        
        // aufgabe g
   /*   pixel1 = pixel >> 16 & 0xff0000ff;
        pixel2 = pixel >> 8 & 0xff00ff00;
        filteredPixel = (pixel & 0xffff0000);
        getauscht = (pixel1 | pixel2 | filteredPixel );
        
        return getauscht;
     */   
        
    }
}
 

disart

Mitglied
wie muss ich denn den code umschreiben bzw. dazuschreiben, dass die ,wie oben angegebenen, filter funktioniert?
 
S

SlaterB

Gast
danke,

-------

fang doch mal mit schwarz weiß an,
du brauchst also die Mittelfarbe,
wenn du nicht weißr welche das ist, dann probiere ein bisschen,
male ein 100x100 Array mit Farbwerten die langsam ansteigen,

versuche es am Anfang evtl nur mit einem einfarbigen Bild, z.B. nur mit dem Blau-Anteil

hast denn diesen komplizierten << und >> Code selber geschrieben?
der erscheint mir ja viel schwieriger..
 

disart

Mitglied
nee, war alles vorgegeben, hab nur die filteralgorithmen eingebaut.
versteh den code auch gar nicht, soweit sind wir in java noch nicht.
wir sind im moment bei bit operationen, und um diese zu üben, sollen wir eben einige filter algorithmen einbaun.
d.h. ich muss mich, um die aufgabe zu lösen, auf einfache dinge beschränken, wie etwa das bitweise verschieben.
deswegen kann ich leider auch nichts mit deiner antwort anfangen.
 
S

SlaterB

Gast
nun ja wenn du nicht weißt, was die einzelnen Pixel in deinem Bild sind,
dann kommst du natürlich nicht voran,


mein Tipp ist immer noch:
fange z.B. mit Blau an:
//filteredPixel = (pixel & 0xff0000ff); // blau

male dir ein Bild mit verschiedenen Blautönen,
z.B.
0xff000050
0xff0000A0
0xff000007

usw. und lerne langsam aber sicher, was denn blau eigentlich ist,
wenn du auch damit wieder nix anfangen kannst,
ja wie soll man dir denn dann sonst helfen?

ohne ein Minimum an graphischen und Bitschiebe-Kenntnissen kann man an so eine Aufgabe nicht rangehen,
da kannst du ja gleich nach einem Programm für Word fragen ;)
 

disart

Mitglied
achso,
ne da haben wir uns falsch verstanden,

das weiß ich schon,
0xff0000ff steht zum beispiel für reines blau, also als rgb wert r=0, g=0 und b=255
und wenn ich jetzt will, dass das programm mir nur z.b. helle stellen ausgibt, würd ich sagen,
dass java bei der hälfte also bei 0xff000077 anfangen soll die pixel auszugeben und eben bei 0xff0000ff aufhören,
und bei den dunklen eben umgekehrt.
die frage is, wie sag ich java das?
habs mit ner if anweisung probiert und dann mit nem größer oder kleiner zeichen, funktioniert aber nicht.
 
S

SlaterB

Gast
'funktioniert aber nicht' ist kein korrektes Vorgehen,
nenne Fehlermeldungen
oder Beispiel mit gewünschtem Ausgang und davon abweichendem tatsächlichen Ausgang

ich selber habe davon auch nicht viel mehr Ahnung, würde da aber strukturiert vorgehen,
z.B. bekomme ich mit
Code:
		int color1 = 0xff000050;
		int color2 = 0xff000090;
		int mitte = 0xff000080;

		String info;
		info =
			"ist color1  " + color1 + " größer als die Mitte: " + mitte + "?: ";
		System.out.println(info + (color1 > mitte));
		info =
			"ist color2  " + color2 + " größer als die Mitte: " + mitte + "?: ";
		System.out.println(info + (color2 > mitte));
sofort sowohl ein true als auch ein false
(80 ist wohl eher die Mitte)


bei diesen Bits ist das allerdings allgemein recht schwierig,
wer weiß wie Java die interpretiert,
nachher sind alle ungeraden Zahlen helle Farben und alle geraden Zahlen dunkle,
weil ein bestimmten Bit als Vorzeichen gilt

deshalb: testen testen testen, von selber geht da nix
evtl. muss man am Ende auf Bitebene prüfen, z.B. schauen ob das höchste Bit gesetzt ist:


Code:
		if ((color && 0x00000080) > 0) {
		} else {
		}

dafür wäre es also (ich wiederhole es nochmal) wichtig,
sich bestimmte Beispielfarben (helle, dunkle, mittlere) anzuschauen,
welche int-Repräsentationen haben sie,
auch mal in Binärschreibweise anschauen (010011011)
um das System zu erkennen,
viele System.out.println benutzen (habe in deinem Code noch kein einziges gesehen!)

das fällt alles nicht vom Himmel
 

disart

Mitglied
natürlich hab ich getestet und getestet, aber es kam einfach nix richtiges dabei raus.
system.out.println findest du bei mir deswegen nicht, weil ich ja den code online gestellt habe, der funktioniert.
außerdem braucht man da kein system.out, weil der befehl
Code:
return filteredPixel;
mir das gefilterte bild ausgibt und ich gleich am bild sehen kann, ob sich was getan hat.

aber du hast mir trotzdem sehr geholfen, danke schön.

so funktionierts:

Code:
if ( pixel <= 0xff777777)
        {filteredPixel = ((pixel & 0xffffffff));}
    
       else
        {filteredPixel = ((pixel & 0xff000000));}
        return filteredPixel;
eine simple if else anweisung,
manchmal steht man einfach auf dem schlauch.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
V JSON-Objs aus JSON-Obj filtern und löschen (Manipulation ohne Kenntnis der vollst. Struktur) Java Basics - Anfänger-Themen 12
P Datei einlesen, nach Begriff filtern und in Datei ausgeben. Problem Standardausgabe über Konsole Java Basics - Anfänger-Themen 19
L Zahlungen nach Monat filtern Java Basics - Anfänger-Themen 2
L Texte filtern Java Basics - Anfänger-Themen 36
CptK Bestimmten Integer Wert aus Array filtern Java Basics - Anfänger-Themen 2
S Integer aus Array filtern Java Basics - Anfänger-Themen 4
P Signal Filtern Java Basics - Anfänger-Themen 1
J Objekttypen vergleichen und filtern Java Basics - Anfänger-Themen 6
K Lambda - kompliziertes filtern Java Basics - Anfänger-Themen 5
MrSnake ObservableList filtern Java Basics - Anfänger-Themen 5
N Collection sortieren/ filtern Java Basics - Anfänger-Themen 7
J Textdatei filtern und bearbeiten Java Basics - Anfänger-Themen 1
B Sortieren und Filtern von Tabellen Java Basics - Anfänger-Themen 6
B Input/Output output Datenstrom filtern Java Basics - Anfänger-Themen 0
B Klassen Doppelte werte Filtern XML, Datenbank und DOM Java Basics - Anfänger-Themen 3
Java-DAU String filtern Java Basics - Anfänger-Themen 22
L Palindrome aus Sätzen filtern Java Basics - Anfänger-Themen 53
S Liste speziell filtern Java Basics - Anfänger-Themen 20
Kaniee CharArrayWriter filtern Java Basics - Anfänger-Themen 4
S Datensätze filtern Java Basics - Anfänger-Themen 3
A String mittels RegEx filtern Java Basics - Anfänger-Themen 13
F String filtern und Systeminfos Java Basics - Anfänger-Themen 19
X Strings filtern? Java Basics - Anfänger-Themen 10
J Aus einem String unbekannte zeichen filtern Java Basics - Anfänger-Themen 11
J Regex + Match Zahlen filtern Java Basics - Anfänger-Themen 5
S LinkedList<String[]> filtern und sortieren Java Basics - Anfänger-Themen 9
S String filtern mit replace -> Problem Java Basics - Anfänger-Themen 6
M Filtern von Dateinamen Java Basics - Anfänger-Themen 7
G Zahlen aus String filtern? Java Basics - Anfänger-Themen 3
G Filtern von nicht-darstellbaren Zeichen Java Basics - Anfänger-Themen 3
M ordner überwachen und dateien filtern Java Basics - Anfänger-Themen 3
M Quelltext - Urls filtern Java Basics - Anfänger-Themen 4
G String "filtern" Java Basics - Anfänger-Themen 2
S Liste oder Array filtern Java Basics - Anfänger-Themen 2
N Textdatei einlesen, Filtern und Splitten Java Basics - Anfänger-Themen 4
J Mailadresse aus String filtern Java Basics - Anfänger-Themen 2
C Dateinamen Filtern Java Basics - Anfänger-Themen 10
M Kann man im Filter nach mehreren Strings filtern lassen Java Basics - Anfänger-Themen 11
M Dateien aus Verzeichnis filtern, aber nicht nach Endung Java Basics - Anfänger-Themen 59
G Filtern einer 3stelligen Zahl Java Basics - Anfänger-Themen 7
G aufsteigenden Teilstring aus String filtern? Java Basics - Anfänger-Themen 2
G Reguläre Ausdrücke zum Filtern von logfiles Java Basics - Anfänger-Themen 2
M java sonderzeichen filtern Java Basics - Anfänger-Themen 3
E Laufwerksangabe aus Pfadangabe (String) filtern Java Basics - Anfänger-Themen 10
H Verzeichnis lesen, und nur unterverzeichnisse heraus filtern Java Basics - Anfänger-Themen 6
G mit .* filtern Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben