1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

Image, PixelGrabber auf Android (Bitte Hilfe !)

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Lisa2, 30.07.2012.

  1. Lisa2, 30.07.2012 #1
    Lisa2

    Lisa2 Threadstarter Neuer Benutzer

    Beiträge:
    14
    Erhaltene Danke:
    0
    Registriert seit:
    11.05.2012
    Hallo allerseits!

    Ich muss ein Bild duch Sobel filtern. Ich habe zuerst die fonctionalität auf einen JavaApplet schon eingesetzt und es lief einwandfrei. Allerdings muss das Filter auf einem Android-Mobiltelefon funktionieren.

    Überrachung :ohmy:: Android kennt weder Image noch PixelGrabber weder Toolkit noch MemoryImageSource :crying:

    wie kann ich bitte meine methode "getSobelOf" unter Android zum Laufen bringen?
    z.b.
    Code:
     
        public  Bitmap getSobelOf(Bitmap bitmap) { 
    
                                //*****
             
         return sobelBitmap;
        }
     
     
    Originale Methode(Die vom Compiler erzeugte Fehler sind kommentiert):

    Code:
     
        public Image getSobelOf(Image image) { [COLOR=DarkOrange][I]//ERROR:Image cannot be resolved to a type[/I][/COLOR]
    
            int width = image.getWidth(null);
            int height = image.getHeight(null);
    
            int orig[] = new int[width * height];
    
            PixelGrabber grabber = new PixelGrabber(image, 0, 0, width,
                    height, orig, 0, width);[COLOR=DarkOrange][I]//ERROR: PixelGrabber cannot be resolved to a type[/I][/COLOR]
    
            try {
                grabber.grabPixels();
            } catch (InterruptedException e2) {
                System.out.println("error: " + e2);
            }
    
            sobel sobelObject = new sobel();
            sobelObject.init(orig, width, height);
            orig = sobelObject.process();
    
            Toolkit tk = Toolkit.getDefaultToolkit();[COLOR=DarkOrange][I]//ERROR:Toolkit cannot be resolved to a type[/I][/COLOR]
            Image sobelImage = tk.createImage(new MemoryImageSource(width, height, orig, 0,
                    width));[COLOR=DarkOrange][I]//ERROR:MemoryImageSource cannot be resolved to a type[/I][/COLOR]
    
            return sobelImage;
        }
    
    
    Hier ist die Solel-Klasse, das ist nur Mathe wird von Android natürlich akzeptiert

    Code:
     
    import java.lang.Math;
    
    public class sobel {
    
        int[] input;
        int[] output;
        float[] template = {
                -1, 0, 1, -2, 0, 2, -1, 0, 1
        };;
        int progress;
        int templateSize = 3;
        int width;
        int height;
        double[] direction;
    
        public void sobel() {
            progress = 0;
        }
    
        public void init(int[] original, int widthIn, int heightIn) {
            width = widthIn;
            height = heightIn;
            input = new int[width * height];
            output = new int[width * height];
            direction = new double[width * height];
            input = original;
        }
    
        public int[] process() {
            float[] GY = new float[width * height];
            float[] GX = new float[width * height];
            int[] total = new int[width * height];
            progress = 0;
            int sum = 0;
            int max = 0;
    
            for (int x = (templateSize - 1) / 2; x < width - (templateSize + 1) / 2; x++) {
                progress++;
                for (int y = (templateSize - 1) / 2; y < height - (templateSize + 1) / 2; y++) {
                    sum = 0;
    
                    for (int x1 = 0; x1 < templateSize; x1++) {
                        for (int y1 = 0; y1 < templateSize; y1++) {
                            int x2 = (x - (templateSize - 1) / 2 + x1);
                            int y2 = (y - (templateSize - 1) / 2 + y1);
                            float value = (input[y2 * width + x2] & 0xff)
                                    * (template[y1 * templateSize + x1]);
                            sum += value;
                        }
                    }
                    GY[y * width + x] = sum;
                    for (int x1 = 0; x1 < templateSize; x1++) {
                        for (int y1 = 0; y1 < templateSize; y1++) {
                            int x2 = (x - (templateSize - 1) / 2 + x1);
                            int y2 = (y - (templateSize - 1) / 2 + y1);
                            float value = (input[y2 * width + x2] & 0xff)
                                    * (template[x1 * templateSize + y1]);
                            sum += value;
                        }
                    }
                    GX[y * width + x] = sum;
    
                }
            }
            for (int x = 0; x < width; x++) {
                for (int y = 0; y < height; y++) {
                    total[y * width + x] = (int) Math.sqrt(GX[y * width + x] * GX[y * width + x]
                            + GY[y * width + x] * GY[y * width + x]);
                    direction[y * width + x] = Math.atan2(GX[y * width + x], GY[y * width + x]);
                    if (max < total[y * width + x])
                        max = total[y * width + x];
                }
            }
            float ratio = (float) max / 255;
            for (int x = 0; x < width; x++) {
                for (int y = 0; y < height; y++) {
                    sum = (int) (total[y * width + x] / ratio);
                    output[y * width + x] = 0xff000000 | ((int) sum << 16 | (int) sum << 8 | (int) sum);
                }
            }
            progress = width;
            return output;
        }
    
        public double[] getDirection() {
            return direction;
        }
    
        public int getProgress() {
            return progress;
        }
    
    }
    
    Vielen Dank für Eure Hilfe!
     
  2. Lisa2, 31.07.2012 #2
    Lisa2

    Lisa2 Threadstarter Neuer Benutzer

    Beiträge:
    14
    Erhaltene Danke:
    0
    Registriert seit:
    11.05.2012
    Schon gelöst Danke !!
     
  3. swordi, 31.07.2012 #3
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    wenn du schon hier dir die mühe machst, dann könntest auch gleich reinschreiben wie.

    es gibt wohl nichts blöderes, als wenn man etwas sucht, das gleiche problem findet, aber dann keine lösung dazu, obwohl es eine gibt.
     
  4. Lisa2, 31.07.2012 #4
    Lisa2

    Lisa2 Threadstarter Neuer Benutzer

    Beiträge:
    14
    Erhaltene Danke:
    0
    Registriert seit:
    11.05.2012
    Ja stimmt :blushing::
    Lösung:
    Code:
    public Bitmap getSobelOf() {
    
            width = cutedBitmap.getWidth();
            height = cutedBitmap.getHeight();
    
            orig = new int[width * height];
    
            cutedBitmap.getPixels(orig, 0, width, 0, 0, width, height);
            
            sobel sobelObject = new sobel();
            sobelObject.init(orig, width, height);
            orig = sobelObject.process();
            
            direction = new double[width * height];
            direction = sobelObject.getDirection();
            
            Bitmap sobelBitmap =  Bitmap.createBitmap(cutedBitmap, 0, 0, width, height);    
            
            Bitmap mutableBitmap = sobelBitmap.copy(Bitmap.Config.ARGB_8888, true);
    
            mutableBitmap.setPixels(orig, 0, width, 0, 0, width, height);
    
            return mutableBitmap;
        }
    
     

Diese Seite empfehlen