Визуализация макета на небольшом растровом изображении (Android)

Я хочу раздуть макет, нарисовать его на растровом изображении 96x96 и отправить его в MetaWatch, чей черно-белый экран 96x96 не имеет градаций серого. На самом деле, мне удалось это сделать, но я не доволен результатом: символы либо слишком большие, либо слишком тонкие и нечитаемые.

Если я рендерим вид на растровое изображение 96x96, я получаю очень большие буквы на крошечном экране:

public void sendView(View v) {
    Bitmap bm = createViewBitmap(v, 1, 1);
    sendLcdBitmap(bm);
    bm.recycle();
}

Если я рендерить вид на большее растровое изображение и масштабировать его, вызывая sendViewScaled(R.layout.test_layout, 1, 4), масштабированный текст не выглядит хорошо. То есть он может быть меньше, но он станет слишком тонким, если я уменьшу его.

public void sendViewScaled(View v, int num, int denom) {
    Bitmap bm = createViewBitmap(v, num, denom);
    Bitmap bm2 = Bitmap.createScaledBitmap(bm, SCREEN_SIZE, SCREEN_SIZE, false);
    sendLcdBitmap(bm2);
    bm2.recycle();
    bm.recycle();
}
public void sendViewScaled(int id, int num, int denom) {
    sendViewScaled(inflateView(id), num, denom);
}

Функция для преобразования вида в растровое изображение:

protected Bitmap createViewBitmap(View v, int num, int denom) {
    v.measure(MeasureSpec.makeMeasureSpec(SCREEN_SIZE*num/denom, MeasureSpec.EXACTLY)
             ,MeasureSpec.makeMeasureSpec(SCREEN_SIZE*num/denom, MeasureSpec.EXACTLY)
             );
    Bitmap b = Bitmap.createBitmap(v.getMeasuredWidth(), v.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
    Canvas c = new Canvas(b);
    c.setDensity(Bitmap.DENSITY_NONE);//DisplayMetrics.DENSITY_xxx;
    v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight());
    v.draw(c);
    return b;

}

Функция sendLcdBitmap() преобразует ARGB_8888 в однобитное растровое изображение с помощью функции:

protected boolean isRatherWhite(int color) {
    return Color.red(color)+Color.green(color)+Color.blue(color) > 127*3;
    //return color == Color.WHITE;
}

Итак, вопрос в следующем:

Я хочу сделать макет как R.layout.test_layout на растровое изображение 96x96, черно-белое, без градаций серого. Как мне получить хорошее качество?

Актуальные вопросы:
Преобразование представления в растровое изображение без его отображения в Android?
getMeasuredWidth возвращает совершенно неверное значение
Как изменить размер растрового изображения в Android?
Как конвертировать виды в растровые изображения?
http://www.skoumal.net/en/android-how-draw-text-bitmap

ОБНОВЛЕНИЕ: игра со значением, используемым в isRatherWhite(), немного помогла.

1 ответ

Я думаю, что у вас проблема с масштабированием вниз. Вы можете попробовать разные алгоритмы, подобные тем, которые упоминались здесь: Какой алгоритм уменьшения изображения является лучшим (по качеству)?

Другие вопросы по тегам