Android Desire HD растровое масштабирование - PullRequest
0 голосов
/ 01 ноября 2011

Я создал пользовательское действие камеры, где пользователь может сделать снимок.Изображение сохраняется в каталоге внешнего хранилища с помощью функции обратного вызова изображения.Затем пользователь перенаправляется на другой вид деятельности, где он может просмотреть изображение.Перед показом предварительного просмотра изображение уменьшается в отдельном потоке до определенного максимального размера.Вот код масштабирования:

byte[] tempStorage = new byte[16 * 1024];
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(imagePath, options);

int oldWidth = options.outWidth;
int oldHeight = options.outHeight;

if (oldWidth > MAX_DIM || oldHeight > MAX_DIM) {

    Logger.i(Constants.SCALE_TAG, "Must scale picture");
    int scaleFactor = getScaleFactor(oldWidth, oldHeight);
    options.inJustDecodeBounds = false;
    options.inSampleSize = scaleFactor;
    options.inTempStorage = tempStorage;
    System.gc();
    newB = BitmapFactory.decodeFile(imagePath, options);

} else {

    Logger.i(Constants.SCALE_TAG, "No need for scaling");

    // We do not need to scale the picture, it is small
    // enough.
    System.gc();
    options.inJustDecodeBounds = false;
    options.inTempStorage = tempStorage;
    if (!stop) {
        newB = BitmapFactory.decodeFile(imagePath, options);
    } else {
        return;
    }

}

Вот код, который вычисляет коэффициент масштабирования:

private int getScaleFactor(int oldWidth, int oldHeight) {

    // Holds the raw scale factor.
    float rawScale;

    // Get the scaling factor.
    if (oldWidth >= oldHeight) {
        rawScale = 1.0F / ((MAX_DIM * 1.0F) / (oldWidth * 1.0F));
    } else {
        rawScale = 1.0F / ((MAX_DIM * 1.0F) / (oldHeight * 1.0F)); 
    }
    Logger.i(Constants.SCALE_TAG, "Raw scale factor: " + rawScale);
    return Math.round(rawScale);

}

Этот код прекрасно работает на большинстве устройств, но почему-то Desire HD не будетправильно масштабировать картинку.Похоже, что он берет исходное изображение, дублирует его примерно тридцать раз и разделяет его на растровое изображение, получая странное изображение в виде полос.Кто-нибудь знает об этой проблеме?

1 Ответ

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

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

...