Transparenzfilter mit Toleranz

holtiwilan

Mitglied
Einen schönen Guten Tag.
Ich habe folgenden Filter, um in einem Image eine Transparente Farbe zu setzten:
Code:
public class MakeImageTransparent {
  public static Image makeColorTransparent(Image im, final Color color) {
    ImageFilter filter = new RGBImageFilter() {
      // the color we are looking for... Alpha bits are set to opaque
      public int markerRGB = color.getRGB() | 0xFF000000;

      public final int filterRGB(int x, int y, int rgb) {
        if ( (rgb | 0xFF000000) == markerRGB) {
          // Mark the alpha bits as zero - transparent
          return 0x00FFFFFF & rgb;
        }
        else {
          // nothing to do
          return rgb;
        }
      }
    };

    ImageProducer ip = new FilteredImageSource(im.getSource(), filter);
    return Toolkit.getDefaultToolkit().createImage(ip);
  }
}

Wenn ich jetzt z.B. ein Jpg habe, wird leider nciht der ganz Hintergrund transparent, sondern eben nur die pixel genau der Farbe.

Meine Frage ist nun: Gibt es eine möglichkeit, dieser Klasse auch noch eine Toleranz mitzugeben. Das ich sagen kann 10 int werte im RGB Raum Toleranz?
Könnte ich das einfach mit einer Schleife machen? Oder gibt es da eine Elegantere Lösung?

Vielen Dank für die Hilfe schon mal.

Tim
 
So, ich habe mal was gebastelt.
Nun wird für jedePixel geschaut, ob es in der Toleranz liegt.

Code:
import java.awt.*;
import java.awt.image.*;

public class MakeImageTransparent {
  public static Image makeColorTransparent(Image im, final Color color,
                                           final int toleranz) {
    System.out.println("color.getRGB(): " + color.getRGB());
    System.out.println("markerRGB: " + (color.getRGB() | 0xFF000000));
    ImageFilter filter = new RGBImageFilter() {
      // the color we are looking for... Alpha bits are set to opaque
      public int markerRGB = color.getRGB() | 0xFF000000;
      public Color markerColor = new Color(color.getRGB() | 0xFF000000);
      public final int filterRGB(int x, int y, int rgb) {
        // Ist das zu filternde Pixel
        // gleich der transparenten Farbe?
        Color PixelColor = new Color(rgb | 0xFF000000);
        //if ( (rgb | 0xFF000000) == markerRGB) {
        
        //Liegt die Farbe des Pixels im Toleranzbereich?
        if ( ( ( (markerColor.getRed() - PixelColor.getRed()) < toleranz &&
                (markerColor.getRed() - PixelColor.getRed()) >= 0) ||
              ( (PixelColor.getRed() - markerColor.getRed()) < toleranz &&
               (PixelColor.getRed() - markerColor.getRed()) >= 0)) &&

            ( ( (markerColor.getGreen() - PixelColor.getGreen()) < toleranz &&
               (markerColor.getGreen() - PixelColor.getGreen()) >= 0) ||
             ( (PixelColor.getGreen() - markerColor.getGreen()) < toleranz &&
              (PixelColor.getGreen() - markerColor.getGreen()) >= 0)) &&

            ( ( (markerColor.getBlue() - PixelColor.getBlue()) < toleranz &&
               (markerColor.getBlue() - PixelColor.getBlue()) >= 0) ||
             ( (PixelColor.getBlue() - markerColor.getBlue()) < toleranz &&
              (PixelColor.getBlue() - markerColor.getBlue()) >= 0)))

        {
          // Mark the alpha bits as zero - transparent
          return 0x00FFFFFF & rgb;
        }
        else {
          // nothing to do
          return rgb;
        }
      }
    };

    ImageProducer ip = new FilteredImageSource(im.getSource(), filter);
    return Toolkit.getDefaultToolkit().createImage(ip);
  }
}

ganz gut.
 
Genau das Problem hab ich auch( -> http://www.tutorials.de/tutorials223258.html ) :D
Das ist cool das du da ne Lösung für hast, die werd ich jetzt gleich mal studieren :)
Vielen Dank :)

//edit: Ich glaub ich war da zu voreilig, muss mir mein Problem noch mal genauer angucken, ich glaub ich hab Mist erzählt, vergesst es einfach ;)
 
Zuletzt bearbeitet:
Zurück