'Saving a canvas larger than the physical screen

I'm dynamically drawing a some Image, Text through custom view where user can move text up/down left/right also zoom in/out but I would like to save the whole view as Image.I know I can save image but I need it to be in a higher resolution than the actual screen I'm capturing it on.

I am saving image using

                    File file = new File(imagePath);
                    try {
                        FileOutputStream out = new FileOutputStream(file, false);
                        if (parentView != null) {
                            parentView.setDrawingCacheEnabled(true);
                            Bitmap drawingCache = saveSettings.isTransparencyEnabled()
                                    ? BitmapUtil.removeTransparency(parentView.getDrawingCache())
                                    : parentView.getDrawingCache();
                            drawingCache.compress(saveSettings.getCompressFormat(), saveSettings.getCompressQuality(), out);
                        }
                        out.flush();
                        out.close();
                        Log.d(TAG, "Filed Saved Successfully");
                        return null;
                    } catch (Exception e) {
                        FirebaseCrashlytics.getInstance().recordException(e);
                        e.printStackTrace();
                        Log.d(TAG, "Failed to save File");
                        return e;
                    }

Using above saving functionality image quality is very poor. I need to very high-resolution image.



Solution 1:[1]

Please try this way may help you

class MyActivity extends Activity {
    private View rootLayoutContainerView;
    private int imageWidth;
    private int imageHeight;
    private int screenLayoutWidth;
    private int screenLayoutHeight;

    public final void nextToOverlay() {
        Bitmap result = Bitmap.createBitmap(this.screenLayoutWidth, this.screenLayoutHeight, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(result);
        rootLayoutContainerView.draw(canvas);
        result = resizeBitmapFitXY(imageWidth, imageHeight, result);
        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
        result.compress(Bitmap.CompressFormat.PNG, 100, bytes);
        File file = getimagePath((Context)this, "framelayer");

        try {
            FileOutputStream fo = new FileOutputStream(file);
            fo.write(bytes.toByteArray());
            fo.flush();
            fo.close();
        } catch (IOException var6) {
            var6.printStackTrace();
        }

    }

    public final Bitmap resizeBitmapFitXY(int width, int height,Bitmap bitmap) {
        Bitmap background = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        float originalWidth = (float)bitmap.getWidth();
        float originalHeight = (float)bitmap.getHeight();
        Canvas canvas = new Canvas(background);
        float scale = 0.0F;
        float xTranslation = 0.0F;
        float yTranslation = 0.0F;
        if (originalWidth > originalHeight) {
            scale = (float)height / originalHeight;
            xTranslation = ((float)width - originalWidth * scale) / 2.0F;
        } else {
            scale = (float)width / originalWidth;
            yTranslation = ((float)height - originalHeight * scale) / 2.0F;
        }

        Matrix transformation = new Matrix();
        transformation.postTranslate(xTranslation, yTranslation);
        transformation.preScale(scale, scale);
        Paint paint = new Paint();
        paint.setFilterBitmap(true);
        canvas.drawBitmap(bitmap, transformation, paint);
        return background;
    }

    public File getimagePath(Context context,String name) {
        File mTranscodeOutputFile = null;
        try {
            File outputDir = new File(context.getExternalFilesDir(null), "image");
            if (!outputDir.exists()) {
                outputDir.mkdir();
            }

            mTranscodeOutputFile = new File(outputDir, name + ".jpg");
        } catch (Exception var5) {
        }
        return mTranscodeOutputFile;
    }
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 gpuser