inPreferredConfig () не работает в Android Gingerbread - PullRequest
1 голос
/ 27 ноября 2011

У меня есть приложение, встроенное в Android 2.2, и я использую inPreferredConfig() для переключения растрового изображения в формат ARGB_8888, однако, это не похоже на работу, так как при немедленной проверке растровое изображение все еще находится в RGB_565 формат.Я попытался изменить его на любой из других форматов, и ни один из них тоже не работает.

Функция отлично работает, если телефон или эмулятор работает под управлением Android 2.2, но ничего выше, что не удается.Кто-нибудь знает, почему это происходит?Является ли inPreferredConfig() устаревшим в более поздних версиях Android?


Что я делаю:

Я использую NDK с некоторым C-кодом, который у меня естьобнаружен запуск некоторых функций обработки изображений (взято из http://www.ibm.com/developerworks/opensource/tutorials/os-androidndk/section5.html). Код C ожидает, что формат изображения будет в ARGB_8888, и хотя в документации Android сказано, что формат уже должен быть в 8888 по умолчанию, но он определенно в 565, поэтому яЯ в замешательстве.

Полагаю, я мог бы преобразовать его в C ... но я ужасен в C, поэтому я не знаю, с чего начать.

Моя функция C:

{
    AndroidBitmapInfo  infocolor;
    void*              pixelscolor; 
    AndroidBitmapInfo  infogray;
    void*              pixelsgray;
    int                ret;
    int             y;
    int             x;


    LOGI("convertToGray");
    if ((ret = AndroidBitmap_getInfo(env, bitmapcolor, &infocolor)) < 0) {
        LOGE("AndroidBitmap_getInfo() failed ! error=%d", ret);
        return;
    }


    if ((ret = AndroidBitmap_getInfo(env, bitmapgray, &infogray)) < 0) {
        LOGE("AndroidBitmap_getInfo() failed ! error=%d", ret);
        return;
    }


    LOGI("color image :: width is %d; height is %d; stride is %d; format is %d;flags is %d",infocolor.width,infocolor.height,infocolor.stride,infocolor.format,infocolor.flags);
    if (infocolor.format != ANDROID_BITMAP_FORMAT_RGBA_8888) {
        LOGE("Bitmap format is not RGBA_8888 !");
        return;
    }


    LOGI("gray image :: width is %d; height is %d; stride is %d; format is %d;flags is %d",infogray.width,infogray.height,infogray.stride,infogray.format,infogray.flags);
    if (infogray.format != ANDROID_BITMAP_FORMAT_A_8) {
        LOGE("Bitmap format is not A_8 !");
        return;
    }


    if ((ret = AndroidBitmap_lockPixels(env, bitmapcolor, &pixelscolor)) < 0) {
        LOGE("AndroidBitmap_lockPixels() failed ! error=%d", ret);
    }

    if ((ret = AndroidBitmap_lockPixels(env, bitmapgray, &pixelsgray)) < 0) {
        LOGE("AndroidBitmap_lockPixels() failed ! error=%d", ret);
    }

    // modify pixels with image processing algorithm

    for (y=0;y<infocolor.height;y++) {
        argb * line = (argb *) pixelscolor;
        uint8_t * grayline = (uint8_t *) pixelsgray;
        for (x=0;x<infocolor.width;x++) {
            grayline[x] = 0.3 * line[x].red + 0.59 * line[x].green + 0.11*line[x].blue;
        }

        pixelscolor = (char *)pixelscolor + infocolor.stride;
        pixelsgray = (char *) pixelsgray + infogray.stride;
    }

    LOGI("unlocking pixels");
    AndroidBitmap_unlockPixels(env, bitmapcolor);
    AndroidBitmap_unlockPixels(env, bitmapgray);


}

Мои функции Java:

 // load bitmap from resources
    BitmapFactory.Options options = new BitmapFactory.Options();
    // Make sure it is 24 bit color as our image processing algorithm expects this format
    options.inPreferredConfig = Config.ARGB_8888;
    bitmapOrig = BitmapFactory.decodeResource(this.getResources(), R.drawable.sampleimage,options);
    if (bitmapOrig != null)
        ivDisplay.setImageBitmap(bitmapOrig);

-

bitmapWip = Bitmap.createBitmap(bitmapOrig.getWidth(),bitmapOrig.getHeight(),Config.ALPHA_8);
    convertToGray(bitmapOrig,bitmapWip);
    ivDisplay.setImageBitmap(bitmapWip);

Спасибо, N

PS Мой последний вопрос на ту же темубыл удален, что раздражает, так как я нигде не могу найти ответы на этот вопрос.

Ответы [ 2 ]

0 голосов
/ 04 марта 2013

Это старый, но пока не вполне удовлетворительный ответ: Просто столкнулся с той же проблемой на днях.

Пока я не могу решить эту проблему, и я думаю о создании конвертера. Поскольку я использую OpenCV, а они не поддерживают формат 565.

Сохранение изображения и его повторная загрузка с другими настройками работает, но, к сожалению, для приложения камеры в реальном времени это невозможно.

Посмотрите на этот код:

Как преобразовать 16-разрядный RGB565 в 24-разрядный RGB888?

0 голосов
/ 27 ноября 2011

Изображения загружаются с конфигурацией ARGB_8888 по умолчанию, согласно документации, поэтому я предполагаю, что она распознает формат RGB_565 вашего растрового изображения и изменит конфигурацию для этого. Я не понимаю, почему это должно быть проблемой, если исходное изображение имеет формат RGB_565 и не имеет прозрачности.

Вот документация - прочитайте последний бит:

Если это не ноль, декодер попытается декодировать в эту внутреннюю конфигурацию. Если он равен нулю или запрос не может быть удовлетворен, декодер попытается выбрать наиболее подходящую конфигурацию на основе глубины экрана системы и характеристик исходного изображения, таких как наличие альфа-изображения на пиксель (для этого требуется конфигурация, которая также делает). Образ загружается с конфигурацией ARGB_8888 по умолчанию.

http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html#inPreferredConfig

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...