Android - 在我以编程方式完成后缩放图像

时间:2011-01-25 12:43:11

标签: android background imagebutton image-scaling

奇怪的事情发生了 - 至少我没有得到它。

我有一个图像(w:120px,h:63px),它出现在一个ImageButton上。我拥有的该图像的唯一变体是放在drawable-hdpi中(并且没有其他可绘制目录)。 这个图像和每个分辨率(密度)一切都很好,Android非常好地处理它。

但是,麻烦的是我从相册中拍摄照片(例如一些非常大的照片),将其缩放到按钮的尺寸(之前提到过,w:120px h:63px)并将该小图像设置为ImageButton背景

如果我在具有中密度(160)的仿真器上进行测试,则可以,但是当在高密度按钮上进行测试时,由于缩放后的图像显得较小,因此会调整大小。

有没有人知道发生了什么,以及为什么在缩放图像后图像的大小会再次发生变化?

任何线索都将受到高度赞赏。

以下是我用于调整图片大小的代码:

public static void resizeAndSaveImage(String pathToResize, int newWidth, int newHeight, FileOutputStream output) {
try {
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inSampleSize = 8;
    Bitmap bitmap = BitmapFactory.decodeStream(new FileInputStream(pathToResize), null, options);
    if (bitmap != null) {
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();
        float scaleWidth = ((float) newWidth) / width;
        float scaleHeight = ((float) newHeight) / height;
        Matrix matrix = new Matrix();
        matrix.postScale(scaleWidth, scaleHeight);
        Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);
        resizedBitmap.compress(Bitmap.CompressFormat.PNG, 100, output);
        output.close();
    }
} catch (Exception e) {
    // ...
}

尺寸参数传递如下:newWidth = 120,newHeight = 63。

1 个答案:

答案 0 :(得分:1)

为了达到你想要的效果,你需要使用与密度无关的像素(dp),而不是物理像素。从here阅读:

  

与密度无关的像素是   相当于一个物理像素   160 dpi屏幕,基线密度   由平台承担(如上所述)   稍后在本文件中)。在运行时,   平台透明地处理任何   基于所需的dp单位的缩放   关于屏幕的实际密度   使用。将dp单位转换为   屏幕像素很简单:pixels = dps   *(密度/ 160)。例如,在240 dpi屏幕上,1 dp将等于1.5   物理像素。使用dp单位   定义您的应用程序的UI是非常高的   建议,作为一种确保方式   在不同的UI上正确显示您的UI   屏幕。

为了更详细地解释为什么一个图像(专辑照片)而不是图像资源,您需要发布用于缩放的代码。