android不同版本 分辨率不一样,同一图片测出的长和宽也不一样!获取屏幕的宽和高

文章探讨了在不同屏幕尺寸下使用canvas.drawBitmap方法绘制图片时,图片位置出现变化的原因,并提供了相应的解决方法。

    今天利用canvas.drawBitmap方法画图片的时候发现一个问题,用2.1版本做的时候是居中显示的,

后来用2.2的时候却发现同样的图片,却不能居中显示了。我看了,用的是同一图片,后来想了想,估

计是与版本有关系,于是就测了下,发现同样的测试代码,在2.1版本测出屏幕长和宽为533*320图片

的长和宽为480*320,2.2版本测出屏幕长和宽为800*480图片的长和宽为720*480.

    看到这个结果我恍然大悟了,因为我的代码里是把屏幕的宽度和高度统一写死为480*320,图片的

坐标是由屏幕和图片的宽和高共同决定的,所以导致了这个结果。代码大概如下:

Paint paint = new Paint();  //画笔

int screenWidth=480;   //屏幕宽度
int screenHeight=320; 
 //屏幕高度 

Bitmap bm = BitmapFactory.decodeResource(activity.getResources(), R.drawable.bnkjs);//图片

currentX=screenWidth/2-bm.getWidth()/2;  //图片的X坐标

currentY=screenHeight/2-bm.getHeight()/2; //图片的Y坐标

canvas.drawBitmap(bm, currentX, currentY, paint);


后来把屏幕的宽度和高度修改为获取当前屏幕的宽度和高度后就可以正常居中显示了,代码如下:


Paint paint = new Paint(); //画笔

int screenWidth=wm.getDefaultDisplay().getWidth();   //屏幕宽度
int screenHeight=wm.getDefaultDisplay().getHeight();  //屏幕高度

Bitmap bm = BitmapFactory.decodeResource(activity.getResources(), R.drawable.bnkjs);//图片

currentX=screenWidth/2-bm.getWidth()/2; //图片的X坐标

currentY=screenHeight/2-bm.getHeight()/2; //图片的Y坐标

canvas.drawBitmap(bm, currentX, currentY, paint);



<think>我们已知QPixmap是一个绘图设备,可以加载图片并在上面绘制。用户希望使用drawPixmap方法来绘制一个固定大小的区域,就像使用QRect指定坐标、一样。 根据Qt文档,QPainter::drawPixmap有多种重载形式。其中一种常用的形式是: void QPainter::drawPixmap(int x, int y, int width, int height, const QPixmap &pixmap); void QPainter::drawPixmap(const QRect &rectangle, const QPixmap &pixmap); 因此,我们可以使用以下两种方式之一: 1. 指定左上角的坐标(x, y)以及度。 2. 指定一个QRect对象,其中包含了位置大小。 下面我们通过示例代码来说明: 假设我们有一个QPixmap对象pixmap,我们希望将其绘制到窗口的(100,100)位置,并且将其缩放到200x200的大小。 方法一:使用坐标 painter.drawPixmap(100, 100, 200, 200, pixmap); 方法二:使用QRect QRect targetRect(100, 100, 200, 200); painter.drawPixmap(targetRect, pixmap); 注意:如果原始图片的大小指定的矩形大小一致,那么图片会被缩放以适应矩形区域。 另外,如果只想绘制图片的一部分,可以使用另一个重载: void QPainter::drawPixmap(const QRect &target, const QPixmap &pixmap, const QRect &source); 例如,我们只想绘制原始图片中从(0,0)开始的一个100x100的区域,然后将其放大绘制到目标区域(100,100,200,200)中: QRect targetRect(100, 100, 200, 200); QRect sourceRect(0, 0, 100, 100); painter.drawPixmap(targetRect, pixmap, sourceRect); 这样,原始图片的sourceRect部分会被绘制到目标区域targetRect(并且会缩放以适应目标区域)。 现在,根据用户的需求,他想要“框定固定大小”,即指定坐标、,那么我们可以推荐使用第一种或第二种方法。 下面是一个完整的示例,在paintEvent中使用drawPixmap绘制一个固定大小的区域: ```cpp void Widget::paintEvent(QPaintEvent *event) { Q_UNUSED(event); QPainter painter(this); // 加载一张图片 QPixmap pixmap(":/images/test.jpg"); // 请替换为实际的图片路径 // 方法1:直接指定坐标 painter.drawPixmap(100, 100, 200, 200, pixmap); // 方法2:使用QRect指定目标区域 // QRect targetRect(100, 100, 200, 200); // painter.drawPixmap(targetRect, pixmap); } ``` 注意:如果图片资源存在,可能会绘制空白。因此,确保路径正确。 此外,用户提到“如同使用qrect一样指定坐标、”,所以我们重点推荐使用QRect的方式,因为这样更直观,且与QRect的使用方式一致。 因此,我们可以这样回答用户: 您可以使用drawPixmap的重载函数,它接受一个QRect作为目标区域,例如: painter.drawPixmap(QRect(x, y, width, height), pixmap); 其中x, y是左上角坐标,widthheight是目标区域的。 另外,如果需要对原始图片进行裁剪(即只绘制图片的一部分),可以使用带有源区域的重载函数。 希望这能满足用户的需求。 </think>要使用 `drawPixmap` 绘制固定大小的图像,并像 `QRect` 一样精确指定坐标、度,可以通过以下两种等效方式实现: ### 方法 1:直接指定坐标尺寸参数 ```cpp painter.drawPixmap(x, y, width, height, pixmap); ``` - `x`, `y`:图像左上角坐标(单位:像素) - `width`, `height`:图像显示区域的度(单位:像素) - `pixmap`:要绘制的 `QPixmap` 对象 ### 方法 2:通过 `QRect` 指定目标区域 ```cpp painter.drawPixmap(QRect(x, y, width, height), pixmap); ``` - `QRect(x, y, width, height)`:定义目标矩形区域 - `pixmap`:要绘制的图像对象 ### 完整示例代码 在 `QPaintEvent` 中使用: ```cpp void Widget::paintEvent(QPaintEvent *event) { QPainter painter(this); // 加载图像(替换为实际路径) QPixmap pixmap(":/images/photo.jpg"); // 方法1:直接参数指定 painter.drawPixmap(50, 50, 200, 150, pixmap); // (50,50)位置,200×150大小 // 方法2:通过QRect指定 QRect targetArea(300, 50, 200, 150); // (300,50)位置,200×150大小 painter.drawPixmap(targetArea, pixmap); } ``` ### 关键特性: 1. **自动缩放**:当原始图像尺寸与目标区域尺寸符时,图像会自动缩放填充目标矩形区域[^1] 2. **坐标系统**:使用与 `drawRect()` 相同的坐标系(左上角为原点 `(0,0)`) 3. **尺寸控制**:通过 `width/height` 精确控制显示尺寸,受原始图像尺寸影响 4. **比例保持**:如需保持比,需手动计算缩放比例,或使用 `QPixmap::scaled()` > 提示:若需裁剪特定区域,可使用重载方法 `drawPixmap(QRect, QPixmap, QRect)`,其中第三个参数指定源图像的裁剪区域[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值