Peter: Bildfarben bearbeiten

Hallo,

Ist es möglich ohne alzugroßen Kalorienaufwand Bildfarben in Java zu bearbeiten ? Sprich ich habe ein gif mit einer bestimmten Hintergrundfabre und diese will ich durch eine andere ersetzen...ich bin bei meiner suche über die klasse graphics gestolpert aber irgendwie scheint die nicht so recht das zu können was ich will...
zur Not würde ich die Datei so einlesen und dann anhand des Dateiformats die Farben ändern , allerdings hatte ich da das Problem daß ich mir die Datei nicht Byteweise (also in Zahlen) ausgeben lassen konnte weil ich, wenn ich die Datei per Stream einlese und ausgeben will immer die Zahlen direkt als unlesbare Ascii zeichen ausgeebn werden und eine Umformung vor der Ausgabe hat leider auch nix hervorgebracht...kann mir jemand helfen ?

Gruss
 Peter

  1. Hallo,

    Ist es möglich ohne alzugroßen Kalorienaufwand Bildfarben in Java zu bearbeiten ? Sprich ich habe ein gif mit einer bestimmten Hintergrundfabre und diese will ich durch eine andere ersetzen...ich bin bei meiner suche über die klasse graphics gestolpert aber irgendwie scheint die nicht so recht das zu können was ich will...

    Stimmt.

    zur Not würde ich die Datei so einlesen und dann anhand des Dateiformats die Farben ändern ,

    Mmh?

    allerdings hatte ich da das Problem daß ich mir die Datei nicht Byteweise (also in Zahlen) ausgeben lassen konnte weil ich, wenn ich die Datei per Stream einlese und ausgeben will immer die Zahlen direkt als unlesbare Ascii zeichen ausgeebn werden und eine Umformung vor der Ausgabe hat leider auch nix hervorgebracht...kann mir jemand helfen ?

    Mmh?

    Du willst ein BufferedImage verwenden. Dort kannst du Pixel einzeln
    auslesen und setzen. (Besonders performant ist das allerdings nicht.
    Aber du willst ja eine kalorienreduzierte Lösung. *g*)

    Sieh dir einfach mal folgende Seite aus dem Java Almanac an:
      http://javaalmanac.com/egs/java.awt.image/pkg.html
    (Die Punkte unter "Buffered Images")

    Im Grunde steht da schon alles beschrieben, was du vermutlich
    brauchst.

    Allerdings beziehen sich die genannten Methoden auf ein
    Bild mit RGB-ColorModel. Ein GIF-Bild ist aber nicht (direkt) RGB,
    sondern hat eine Palette. Es ist Color-Indexed.

    Du wirst also vermutlich einzelne Pixel über die Methoden
      BufferedImage.getRaster().getSample(int x, int y, int b);
      BufferedImage.getRaster().setSample(int x, int y, int b, int color);
    lesen und setzen müssen.

    Die Paramter "x" und "y" sollten klar sein.
    "b" ist die "Schicht" (aka "band"). Ein RGB-Bild hat z.B. 3 Schichten,
    nämlich für Rot, Grün und Blau. Letzendlich ist jede Schicht nichts
    anderes als ein Array, in dem eben jeweils nur die roten, grünen
    und blauen Farbwerte abgelegt sind.
    Ein GIF-Bild hat nur eine Schicht, weil es nur Index-Werte, die von 0
    bis 255 reichen, enthält. Es sind also keine Farbwerte, sondern
    Index-Werte auf die Farben der Palette.
    Du wirst daher bei deinem Aufruf für "b" immer 0 setzen, da du auf
    die erste (und einzige) Schicht zugreifen möchtest.
    Der Paramater "color" -- eigentlich heißt er "sample" -- ist in deinem
    Fall der zu setzende Index.

    Willst du Pixel 10|20 auf den Index 129 setzen, so würde der Aufruf
      image.getRaster().setSample(10, 20, 0, 129);
    genau das tun.

    Weiteres Problem:
    Java kann keine GIF-Bilder schreiben. (Hat sich das eigentlich seit
    JDK 1.5 geändert?) Entweder du verwendest einen der vielen
    GIF-Schreiberklassen, die du kostenlos im Internet findest. Oder du
    schaust dir mal das Java Advanced Imaging an. Das kann meines Wissens
    nach auch GIF-Dateien schreiben.

    Wenn konkrete Probleme auftreten, kannst du ja nochmal nachfragen.

    Gruß
    Slyh