1. Lisa2, 30.07.2012 #1
    Lisa2

    Lisa2 Threadstarter Neuer Benutzer

    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

    Schon gelöst Danke !!
     
  3. swordi, 31.07.2012 #3
    swordi

    swordi Gewerbliches Mitglied

    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

    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;
        }
    
     
Die Seite wird geladen...
Similar Threads Forum Datum
Suche App/Launcher für Android 2.0 Android Wear Geräte Gestern um 08:37 Uhr
Die neue Android-Hilfe App ist ab sofort erhältlich Anregungen zum Forum Gestern um 10:53 Uhr
Es gibt eine nagelneue Android-Hilfe App Android News Gestern um 11:16 Uhr
Schlüssellänge bei SD-Karten Verschlüsselungen Android Sicherheit - AntiVirus, Firewalls, Datenschutz, Verschlüsselung Gestern um 11:46 Uhr
Zu wenig Speicher beim Update auf Android 7 Android Allgemein Gestern um 11:58 Uhr
Hannspad 133 Titan 2 SN14TP1B2A Android-Tablet und GPS HANNspree Forum Gestern um 17:03 Uhr
Android WLAN Problem? Android 5.0.x / 5.1.x (Lollipop) Gestern um 19:59 Uhr
WLAN (und Bluetooth) nicht mehr möglich Android 6.0.x (Marshmallow) Gestern um 20:48 Uhr
Seit Android 7 bucht sich S6 nicht mehr automatisch ins Datennetz ein Android 7.x (Nougat) Heute um 05:55 Uhr
Apps werden seit Android 7 Update öfters geschlossen... Root / Custom-ROMs / Modding für Samsung Galaxy S6 (Edge) Vor 5 Minuten