Растровое изображение, чтобы использовать getPixels? - PullRequest
1 голос
/ 20 февраля 2012

Если я сделаю снимок с моей Samsung Galaxy S2, изображение будет 3264 х 2448 пикселей.Я хочу использовать проверку цветового диапазона, но она не работает.

Однако, если я уменьшу изображение, например, 2500 x 2500 (меньше пикселей), то это сработает.Но я хочу использовать размер картинки галактики s2 (3264 x 2448).Я думаю, что это проблема с памятью?Я точно не знаю, каков предел.Но есть ли еще один способ «обойти» эту проблему?

Это кусок кода, как я это делаю сейчас:

bmp = BitmapFactory.decodeResource(getResources(),
                R.drawable.four_colors);

int width = bmp.getWidth();
int height = bmp.getHeight();
int[] pixels = new int[width * height];

bmp.getPixels(pixels, 0, width, 0, 0, width, height);

for (int y = 0; y < height; y++){
            for (int x = 0; x < width; x++){
                     int index = y * width + x;
                     int R = (pixels[index] >> 16) & 0xff;     //bitwise shifting
                     int G = (pixels[index] >> 8) & 0xff;
                     int B = pixels[index] & 0xff;
                     total++;
                     if ((G > R)&&(G > B)){
                         counter++;
                    }
            }
}

Это дает сбой, потому что картинка слишком большая, маленькаяфото работают.Так их что-нибудь, чтобы «обойти» эту проблему?вместо того, чтобы использовать меньшие изображения:)

Я пробовал некоторые другие вещи, но безуспешно, я пытаюсь объяснить, что я пытался.

  1. Я пытался "вырезать" изображениепополам, а затем сканировать отдельно (* не работает).

  2. , и я попытался отсканировать только половину (1632 x 1224), а затем повернуть изображение (на 180 градусов)и отсканируйте его снова, но также это не сработало.

  3. Ударь меня:)

Ответы [ 2 ]

5 голосов
/ 20 февраля 2012

При игре с огромными изображениями вам действительно следует использовать BitmapRegionDecoder для обработки его кусками.

Редактировать - теперь с простым примером:

    try {
        // Processes file in res/raw/huge.jpg or png
        BitmapRegionDecoder decoder = BitmapRegionDecoder.newInstance(getResources().openRawResource(R.raw.huge), false);
        try  {
            final int width = decoder.getWidth();
            final int height = decoder.getHeight();
            // Divide the bitmap into 1024x768 sized chunks and process it.
            int wSteps = (int) Math.ceil(width / 1024.0);
            int hSteps = (int) Math.ceil(height / 768.0);
            Rect rect = new Rect();
            long total = 0L, counter = 0L;
            for (int h = 0; h < hSteps; h++) {
                for (int w = 0; w < wSteps; w++) {
                    int w2 = Math.min(width, (w + 1) * 1024);
                    int h2 = Math.min(height, (h + 1) * 768);
                    rect.set(w * 1024, h * 768, w2, h2);
                    Bitmap bitmap = decoder.decodeRegion(rect, null);
                    try {
                        int bWidth = bitmap.getWidth();
                        int bHeight = bitmap.getHeight();
                        int[] pixels = new int[bWidth * bHeight];
                        bitmap.getPixels(pixels, 0, bWidth, 0, 0, bWidth, bHeight);
                        for (int y = 0; y < bHeight; y++){
                            for (int x = 0; x < bWidth; x++){
                                int index = y * bWidth + x;
                                int R = (pixels[index] >> 16) & 0xff;     //bitwise shifting
                                int G = (pixels[index] >> 8) & 0xff;
                                int B = pixels[index] & 0xff;
                                total++;
                                if ((G > R)&&(G > B)){
                                    counter++;
                                }
                            }
                        }
                    } finally {
                        bitmap.recycle();
                    }
                }
            }
        } finally {
            decoder.recycle();
        }
1 голос
/ 20 февраля 2012

Вы можете ограничить количество пиксельных данных изображения, которое вы загружаете за один раз, используя некоторые параметры метода getPixels.Я делал что-то очень похожее и, например, читал их по одной строке.

    for(int y = 0; y < height; y++)
    {
        bitmap.getPixels(pixels, 0, width, 0, y, width, 1);
...