drawBitmap с неточной матрицей

#android #android-canvas #android-bitmap

#Android #android-холст #android-растровое изображение #android-растровая карта

Вопрос:

Я пытаюсь использовать Canvas.drawBitmap(...) для рисования Bitmaps на Canvas , но он не отображается в правильном положении или размере.

Ниже приведен пример того, как я пытаюсь достичь этого:

 Canvas canvas = new Canvas();
Matrix matrix = new Matrix();

/// scale = 0.5
/// image.getX() = 250
/// image.getY() = 250
matrix.setTranslate(
        imageView.getX() * scale,
        imageView.getY() * scale
);

matrix.setScale(
        scale,
        scale
);

matrix.postRotate(imageView.getRotation(), imageView.getX() * scale, imageView.getY() * scale);

canvas.drawBitmap(bitmap, matrix, null);
  

Результат, который я получаю, заключается в том, что изображение имеет исходный размер в позиции 0x0.
Ожидаемый результат заключается в том, что изображение будет в половину размера и в центре холста.

ПРИМЕЧАНИЕ: я использую matrix.postRotate(...) для рисования растрового изображения, повернутого под тем же углом, что и ImageView .

Ответ №1:

Можете ли вы дать этому шанс, я попытался объяснить логику в комментариях:

 // as you wanted Half size so reduced width and height to half

  Bitmap dstBitmap = Bitmap.createScaledBitmap(srcbitmap,(srcbitmap.getWidth()/2 ),(srcbitmap.getHeight()/2),true);

                // Here I calculate screen size
                DisplayMetrics displayMetrics = new DisplayMetrics();
                getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
                int height = displayMetrics.heightPixels;
                int width = displayMetrics.widthPixels;

   //Create screen size bitmap to position image at center easily
                Bitmap bitmap = Bitmap.createBitmap(
                        width, 
                        height, 
                        Bitmap.Config.ARGB_8888 
                );

                // Initialize a new Canvas  with above bitmap
                Canvas canvas = new Canvas(bitmap);


             
           Matrix matrix = new Matrix();


            // Rotating about center of image
            matrix.setRotate(
                    45, // your angle
                    dstBitmap.getWidth() / 2, 
                    dstBitmap.getHeight() / 2 
            );

  
            matrix.postTranslate(
                    (width  - dstBitmap.getWidth()) / 2,
                    (height - dstBitmap.getHeight() )/ 2
            );

           

            canvas.drawBitmap(dstBitmap, matrix, null);
  

Теперь вы должны быть готовы продолжить, это должно дать вам правильный результат

Комментарии:

1. Спасибо за ваш комментарий @aryan agarwal Я пытался использовать подобный подход, однако проблема в том, что если изображение повернуто, оно не будет работать, поскольку оно рисуется в исходной ориентации

2. Да, я не рассматривал поворот