Yev Kanivets
Yev Kanivets

Reputation: 1800

Converting a view to bitmap (quality issue)

I'm developing an app for creating collages - user can choose and load pictures to set of ImageViews, then he can scale and move them and save it e.g. to album. So, I have an issue with quality of saved image - it's low! I use converting view to bitmap method, and I scale view to fit to 2000x2000 size, but , I guess, scaling don't improve the quality of image - it's like a screenshot of that view(that I convert to bitmap), and I just scale this snapshot - because of it I have low quality image output(

So, guys can I get higher quality of image from view then just its snapshot?

This is my method of converting view ti bitmap:

public static Bitmap loadBitmapFromView(ScalingFrameLayout drawingCanvas, int width, int height, Bitmap.Config config) {
        /**
         * Get previous state
         * */
        ViewGroup.LayoutParams prevParams = drawingCanvas.getLayoutParams();

        /**
         * Scale to
         * */
        drawingCanvas.setScaleX((float) width / (float) prevParams.width);
        drawingCanvas.setScaleY((float) height / (float) prevParams.height);

        /**
         * Create disarable layout size
         * */
        drawingCanvas.setLayoutParams(new RelativeLayout.LayoutParams(width, height));
        drawingCanvas.measure(
                RelativeLayout.MeasureSpec.makeMeasureSpec(drawingCanvas.getLayoutParams().width,
                        RelativeLayout.MeasureSpec.EXACTLY),
                RelativeLayout.MeasureSpec.makeMeasureSpec(drawingCanvas.getLayoutParams().height,
                        RelativeLayout.MeasureSpec.EXACTLY));
        drawingCanvas.layout(0, 0, drawingCanvas.getMeasuredWidth(),
                drawingCanvas.getMeasuredHeight());

        /**
         * Create bitmap according a size
         * */
        Bitmap overAllDrawing = Bitmap.createBitmap(width, height, config);

        /**
         * Draw layout on bitmap
         * */
        Canvas canvas = new Canvas(overAllDrawing);
        drawingCanvas.draw(canvas);

        /**
         * Set previous layout params
         * */
        drawingCanvas.setScale(1);
        drawingCanvas.setLayoutParams(prevParams);

        return overAllDrawing;
    } 

Upvotes: 0

Views: 1330

Answers (1)

Yev Kanivets
Yev Kanivets

Reputation: 1800

I have solved this issue by scaling all of main view childs like this :

/**
         * Create disarable layout size
         * */
        drawingCanvas.setLayoutParams(new RelativeLayout.LayoutParams(width, height));
        drawingCanvas.measure(
                RelativeLayout.MeasureSpec.makeMeasureSpec(drawingCanvas.getLayoutParams().width,
                        RelativeLayout.MeasureSpec.EXACTLY),
                RelativeLayout.MeasureSpec.makeMeasureSpec(drawingCanvas.getLayoutParams().height,
                        RelativeLayout.MeasureSpec.EXACTLY));
        drawingCanvas.layout(0, 0, drawingCanvas.getMeasuredWidth(),
                drawingCanvas.getMeasuredHeight());

And after taking a snapshot of resulted view I change back layout params of all views in my main layout.

Upvotes: 1

Related Questions