Android 放大视图并绘制为位图

Android magnify view and draw as bitmap

我有一台相机,我用它拍了一张照片并保存了一张位图。覆盖在上面的是一个视图寻呼机,具有不同的布局。我拍照的时候也想保存当前叠加的布局

问题是照片和布局都被保存了,布局在位图区域正确修复,但它比预览相机中的要小。我需要放大布局(看起来像以前的照片)并将其保存在我的位图中。

拍照前:

之后(按钮还在就好了,只是测试):

我的代码:

                Bitmap cameraBitmap = BitmapFactory.decodeByteArray
                        (data, 0, data.length);

                int  wid = cameraBitmap.getWidth();
                int  hgt = cameraBitmap.getHeight();

                bitmap = Bitmap.createBitmap
                        (wid, hgt, Bitmap.Config.ARGB_8888);

                Canvas canvas = new Canvas(bitmap);
                canvas.drawBitmap(cameraBitmap, 0f, 0f, null);

                ViewPager pager = (ViewPager) main_activity.findViewById(R.id.pager);
                ScreenSlidePagerAdapter a = (ScreenSlidePagerAdapter) pager.getAdapter();
                ScreenSlidePageFragment currFrag = (ScreenSlidePageFragment) a.instantiateItem(pager, a.getFocusedPage());
                View currView = currFrag.getView();

                Rect rect = new Rect();
                rect.set(0, 0, wid, hgt);
                //Measure the view at the exact dimensions (otherwise the text won't center correctly)
                int widthSpec = View.MeasureSpec.makeMeasureSpec(rect.width(), View.MeasureSpec.EXACTLY);
                int heightSpec = View.MeasureSpec.makeMeasureSpec(rect.height(), View.MeasureSpec.EXACTLY);
                currView.measure(widthSpec, heightSpec);

                //Lay the view out at the rect width and height
                currView.layout(0, 0, rect.width(), rect.height());

                //Translate the Canvas into position and draw it
                canvas.save();
                canvas.translate(rect.left, rect.top);
                currView.draw(canvas);
                canvas.restore();

为什么不按比例创建位图。为此,您需要创建一个可缩放位图,并将宽度设置为屏幕的 1/4,高度设置为屏幕高度的四分之一。

为此,首先在onCreate()方法中,同样加入以下代码获取screenWidth和Height。 -

metrics = getResources().getDisplayMetrics();
    display = getWindowManager().getDefaultDisplay();
    dpi = metrics.densityDpi;
    size = new Point();
    display.getSize(size);
    screenWidth = size.x;
    screenHeight = size.y;

要创建可缩放位图,请使用以下代码,但请记住按比例设置宽度和高度值,如下所示 --

public static int height = MainActivity.screenWidth* 4/10;
public static int width = MainActivity.screenWidth* 4/10;

bg = BitmapFactory.decodeResource(getResources(), R.drawable.bg);
            if (width + heigt > 0) {
                bg = Bitmap.createScaledBitmap(bg,
                        (width), (heigt),
                        false);
            }

此外,为确保可绘制图像保持质量,请确保创建单独的可绘制文件夹,例如“xxhdpi 和 hdpi”。请参阅 http://developer.android.com/guide/practices/screens_support.html。希望有所帮助。祝你好运。

我用视图创建了一个新的位图,并将它与之前的位图合并,结果很好:

Bitmap cameraBitmap = BitmapFactory.decodeByteArray
        (data, 0, data.length);

int  wid = cameraBitmap.getWidth();
int  hgt = cameraBitmap.getHeight();

bitmap = Bitmap.createBitmap
        (wid, hgt, Bitmap.Config.ARGB_8888);

Canvas canvas = new Canvas(bitmap);
canvas.drawBitmap(cameraBitmap, 0f, 0f, null);

ViewPager pager = (ViewPager) main_activity.findViewById(R.id.pager);
ScreenSlidePagerAdapter a = (ScreenSlidePagerAdapter) pager.getAdapter();
ScreenSlidePageFragment currFrag = (ScreenSlidePageFragment) a.instantiateItem(pager, a.getFocusedPage());
View currView = currFrag.getView();

Bitmap viewBitmap = CustomUtil.loadBitmapFromView(currView);
viewBitmap = Bitmap.createScaledBitmap(viewBitmap, wid, wid, false);
canvas.drawBitmap(viewBitmap, 0f, (hgt-wid)/2 /* to center my square view in my rectangular original bitmap */, null);

实用方法:

public static Bitmap loadBitmapFromView(View view) {
    int width = view.getWidth();
    int height = view.getHeight();

    int measuredWidth = View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.EXACTLY);
    int measuredHeight = View.MeasureSpec.makeMeasureSpec(height, View.MeasureSpec.EXACTLY);

    //Cause the view to re-layout
    view.measure(measuredWidth, measuredHeight);
    view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());

    //Create a bitmap backed Canvas to draw the view into
    Bitmap b = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    Canvas c = new Canvas(b);

    //Now that the view is laid out and we have a canvas, ask the view to draw itself into the canvas
    view.draw(c);

    return b;   
}