4

その上にキャンバスが描画された WebView の内容を画像として保存しようとしています。私は2つの方法を試しました:

Picture picture = drawView.capturePicture();
Bitmap bmp = pictureDrawable2Bitmap(new PictureDrawable(picture)); 
MediaStore.Images.Media.insertImage(
    getContentResolver(), bitmap,
    "image" + ".png", "drawing");

 private static Bitmap pictureDrawable2Bitmap(PictureDrawable pictureDrawable){
        Bitmap bitmap = Bitmap.createBitmap(
                pictureDrawable.getIntrinsicWidth() ,pictureDrawable.getIntrinsicHeight(),Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        canvas.drawPicture(pictureDrawable.getPicture());
        return bitmap;
 }

これにより、WebView ページ全体が取得されますが、キャンバスの描画はありません。

方法 2:

 Bitmap bitmap = Bitmap.createBitmap(drawView.getWidth(), drawView.getHeight(),
                     Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
drawView.draw(canvas);
MediaStore.Images.Media.insertImage(
 getContentResolver(), bitmap,
     "image" + ".png", "drawing");
      drawView.destroyDrawingCache();

このようにして、キャンバスと WebView の両方を取得しますが、現在のズーム レベルでのみキャプチャします。つまり、ズームインして保存すると、画像全体ではなく、現在の表示状態のみが保存されます。また、低品質です。

それらをまとめる方法について何か提案はありますか?

コードの一部:

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);

    canvasBitmap = Bitmap.createBitmap(w + 1500, h + 1500, Bitmap.Config.ARGB_8888);
    drawCanvas = new Canvas(canvasBitmap);
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    clipBounds = canvas.getClipBounds();
    canvas.save();
    //canvas.translate(clipBounds.left, clipBounds.top);
    drawPaint.setStrokeWidth(8/mScaleFactor);
    canvas.scale(mScaleFactor, mScaleFactor, 0, 0);
     if(!pathsDrawn) {
           canvas.drawPath(drawPath, drawPaint);
           pathsDrawn = true;
 }
    canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
    canvas.restore();
}

WebView 設定:

    final DrawingView drawView;
    drawView = (DrawingView) findViewById(R.id.pdf);
    drawView.setDrawingCacheEnabled(true);
    WebSettings webSettings = drawView.getSettings();

    webSettings.setLoadWithOverviewMode(true);
    webSettings.setUseWideViewPort(true);
    webSettings.setBuiltInZoomControls(true);
    webSettings.setDefaultZoom(ZoomDensity.FAR);
    webSettings.setSupportZoom(true);
    webSettings.setDisplayZoomControls(false);
    String data = "someurl.jpg"
    drawView.loadUrl(data);     
    drawView.setDrawingCacheEnabled(true);
    Picture picture = drawView.capturePicture();
            Bitmap bmp = pictureDrawable2Bitmap(new PictureDrawable(picture));
            MediaStore.Images.Media.insertImage(getContentResolver(), overlayMark(bmp, DrawingView.canvasBitmap),
                    "dfdsf" + ".png", "drawing");

編集* ほとんどの部分で機能しました。基本的に、canvas で 2 つのビットマップを描きました。ただし、Web イメージ ビットマップと描画ビットマップは正しくスケーリングされません。Web ビットマップにオーバーレイする前に、Matrix を使用して描画をスケーリングし、ビットマップを再描画することで、これを相殺する必要がありました。何らかの理由で、少なくとも私がテストしている 10 インチのタブレットでは、1.5f にスケールすると完全に整列します。誰かがこれについてさらに洞察を持っている場合、またはそれをより良くする方法を知っている場合は、私に知らせてください.

     Matrix matrix = new Matrix();
matrix.postScale(1.5f, 1.5f);
Picture picture = drawView.capturePicture();
Bitmap bmp = pictureDrawable2Bitmap(new PictureDrawable(picture));
Bitmap resizedBitmap = Bitmap.createBitmap(DrawingView.canvasBitmap, 0, 0, DrawingView.canvasBitmap.getWidth(), DrawingView.canvasBitmap.getHeight(), matrix, false);
            MediaStore.Images.Media.insertImage(getContentResolver(), overlayMark(bmp, resizedBitmap),
                    "dfdsf" + ".png", "drawing");

 private static Bitmap pictureDrawable2Bitmap(PictureDrawable pictureDrawable){
        Bitmap bitmap = Bitmap.createBitmap(
                pictureDrawable.getIntrinsicWidth() ,pictureDrawable.getIntrinsicHeight(),Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        canvas.drawPicture(pictureDrawable.getPicture());
        return bitmap;
 }

private Bitmap overlayMark(Bitmap bmp1, Bitmap bmp2)    { 
       int bh = bmp1.getHeight();
       int bw = bmp1.getWidth();
       Bitmap bmOverlay = Bitmap.createBitmap(bw,bh,Bitmap.Config.ARGB_8888); 
       Canvas canvas = new Canvas(bmOverlay); 
       canvas.drawBitmap(bmp1, 0, 0, null);
       canvas.drawBitmap(bmp2, 0, 0, null);
       return bmOverlay;
    } 
4

0 に答える 0