在安卓系统中,位图并不完全适配矩形。

3

我正在使用Android-V11开发一个RDP客户端应用。

服务器:屏幕被分成4个部分,并将图像数据以byte[]形式发送给客户端。每帧的left、top、right、bottom以及屏幕分辨率(宽度--> 1024/1280,高度--? 768/1024)的值都会发送给客户端。

客户端:我正在使用Surface View来显示从服务器接收到的图像。我需要将4个框架(一个服务器屏幕)精确地适配到平板电脑屏幕上。

示例代码:

 class mySurfaceView extends SurfaceView implements SurfaceHolder.Callback
    {



       class TutorialThread extends Thread 
       {
         @Override
         public void run() 
         {
           Canvas c = null;
          // Socket commnuication
           ......
         Bitmap bmp;
          while(true){
           c=null;
           //logic to get the details from server
          .....
         bmp = BitmapFactory.decodeByteArray(imageBytes, 0,imageBytes.length);

        //Logic to calculate the Top Left, right bottom corners to divide the tablet screen into   4parts for 4 frames receiving from server
          .....

    //Frame rectangle for each frame

        Rect rect = new Rect(newLeft, newTop,newWidth,newHeight);

    //display image

       try{

        c  = _surfaceHolder.lockCanvas(rect);

        if(c!=null){
            synchronized (_surfaceHolder) 
            {
                       c.drawBitmap(scaledBitmap, newLeft,newTop, paint);
                    }
              }
          }
          finally{
        if(c!=null){                                     _surfaceHolder.unlockCanvasAndPost(c);
               }
        }
        //End of while
    }
    //End of run()
    }
    //End Tutorial Thread
    }
    //End of surfaceView
    }

我们无法完全适配位图到矩形中。在平板电脑上显示的帧之间存在间隙。
调试代码后,我们发现检索到的位图(bmp)宽度为514,而矩形(rect)宽度为640。所以,位图不适合矩形中。
请问如何缩放位图以完全适配矩形。
注意:我还需要捏合缩放图像。
谢谢 & 问候 Yamini.

2
你需要拉伸位图或获取稍大一点的位图,然后根据窗口大小进行缩放。这比你想象的要复杂一些,因为Android有不同的屏幕尺寸。Yamini,你必须小心处理。 - Andro Selva
谢谢,你说得完全正确。如何在不使用Bitmap.createScaledBitmap(bmp, newWidth, newHeight, false)的情况下对位图进行缩放? - mini
这是不可能的,Yamini。那就是方法。但是你为什么不想使用它?!! - Andro Selva
在进行捏合缩放时遇到问题,捏合缩放后,我在Bitmap.createScaledBitmap(bmp,newWidth,newHeight,false)处收到“内存不足异常”。 - mini
1
是的,使用位图时很常见。你必须尝试学习如何使用位图回收。这很复杂。我也经历过。但没有其他办法。 - Andro Selva
谢谢,但我已经使用 bmp.recycle() 和 scaleBitmap.recycle()(scaleBitmap 是通过 Bitmap.createScaledBitmap(bmp, newWidth, newHeight, false) 缩放后得到的 Bitmap)来回收位图。尽管如此,我仍然遇到了"内存不足异常(out of memory exception)"的问题。 - mini
1个回答

3
首先获取位图的高度和宽度。
final int height= bitmap.getHeight() ;
final int width= bitmap.getWidth();
float h= (float) height;
float w= (float) width;

现在,您的矩形位置是(newLeft, newTop),高度和宽度分别为newHeightnewWidth

现在将位置和缩放因子设置为矩阵对象

Matrix mat=new Matrix();
mat.setTranslate( newLeft, newTop );
mat.setScale(newWidth/w ,newHeight/h);

现在使用矩阵绘制您的位图。
canvas.drawBitmap(bitmap, mat, new paint());

现在您的位图将填充矩形。
尝试一下,祝您好运!

谢谢,您的答案非常有效,通过以下修改c.translate(newLeft, newTop);c.drawBitmap(bmp, matrix, paint);可以很好地将位图适配到矩形中。但是在缩放功能上存在问题(脏区域没有被等比例缩放)。 - mini

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接