我想要扩展布局,将其绘制到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位图,B& W,没有渐变的灰色。我如何获得高质量的产品?
相关问题:
Converting a view to Bitmap without displaying it in Android?
getMeasuredWidth returns totally wrong value
How to Resize a Bitmap in Android?
How to convert Views to bitmaps?
http://www.skoumal.net/en/android-how-draw-text-bitmap
更新:使用 isRatherWhite()中使用的值进行了一些帮助。
答案 0 :(得分:0)
我认为你的问题在于缩小规模。您可以尝试不同的算法,例如此处提到的算法:What is the best image downscaling algorithm (quality-wise)?