Android图片缩放

时间:2011-02-26 11:36:14

标签: android image-scaling

我正在制作1.6的应用程序,我遇到了android图像缩放的问题,我的图片是480x295。

在中等屏幕上,这显示正确,但在大屏幕(480x800或480x854)上它没有填满屏幕,它使得图像大1.5倍,仅为720x442。

由于800实际上是1.67而854是1.78,我显然可以只为drawable-hdpi文件夹包含大图像,但是图像已经是1.5mb,这比人们想象的要大,而且我不能使用app2sd因为我想支持1.6。

有什么建议吗?

我只能想到三个选择: 1)包括较大的图像(但这可能会限制销售,显然会增加apk尺寸)

2)制作2个版本,似乎是一个很好的解决方案,更难实现。

3)更改为1.5,并自行处理所有缩放。

编辑: 更多细节: 我正在使用画布和surfaceview绘图 图片加载代码:

backgroundBMP = BitmapFactory.decodeResource(getResources(), R.drawable.background, null);

绘图代码:

canvas.drawBitmap(backgroundBMP, 0, 0, null);

3 个答案:

答案 0 :(得分:5)

如果您想自己缩放图像,请将一个副本放入:

res/drawable-nodpi

确保资源不在其他文件夹中。

像这样加载位图:

Bitmap bitmap = BitmapFactory.decodeResource(

                    context.getResources(),

                    R.drawable.my_image
                );

像这样调整大小:

bitmap = Bitmap.createScaledBitmap(bitmap, width, height, true);

然后将它画到画布上:

canvas.drawBitmap(bitmap, 0, 0, null);

这是你完成工作所需要知道的最少的事情。

附加说明

通常情况下,Android会根据当前的屏幕密度从其中一个res / drawable文件夹中选择您的图像。

大多数图片格式没有密度信息,因此Android根据加载的文件夹对位图的密度进行假设。

这意味着它可以自己进行缩放以匹配加载的位图的密度和画布密度。

Android会在您加载位图时检查并匹配密度,并在绘制位图时再次

当您进行自己的扩展时,通常希望防止操作系统干扰。有几种方法可以做到:

<强> 1。使用res / drawable-nodpi

这是我在上面的快速示例中概述的策略。如果您想将图像打包为资源,并且仍然自己控制缩放,请将其放在此处,并且只在此处:

res/drawable-nodpi

如果您需要支持Cupcake,请在每个文件夹中复制一份:

res/drawable-nodpi-v4    
res/drawable

解码器会自动提供防止缩放的选项。 Android然后将图像密度设置为与屏幕匹配,因此在绘制时也不会缩放。 The compiler will apply lossless compression to images placed in res/drawable-xxx folders

<强> 2。使用res / raw

如果您将图像放入,则可以使图像保持不变:

res/raw

但是你需要注意防止在运行时缩放:

BitmapFactory.Options options = new BitmapFactory.Options();    

options.inScaled = false; // Prevents scaling at decode time.

Bitmap bitmap = BitmapFactory.decodeResource(

                    context.getResources(),

                    R.raw.my_image,

                    options
                );

bitmap.setDensity(Bitmap.DENSITY_NONE); // Prevents scaling at draw time.

第3。使用资产文件夹

如果您将图片放在资源文件夹中,而不是 res ,则可以使用真实的文件夹结构来整理它们。像这样加载位图资源:

Bitmap bitmap = BitmapFactory.decodeStream(

                    context.getAssets().open(

                        "myfolder/my_image.png",

                        AssetManager.ACCESS_BUFFER
                    )
                );

编译器不会触摸它,它会在没有缩放的情况下加载,并且它的密度设置为与屏幕匹配,因此在绘制它时也不会缩放。

(性能注意:在Android加载图片之前,必须找到该文件。A resource is faster to locate than an asset,因此如果将图片打包为资源,可能会有一些性能损失。)

答案 1 :(得分:3)

如果您想缩放Bitmap,可以在canvas.scale(scaleX, scaleY);之前使用canvas.drawBitmap()进行缩放。您可以计算宽高比并将其用作比例值。

要添加的一件重要事情是,您可以使用<uses-sdk android:minSdkVersion="3" />使用“移至SD卡”功能,并且仍支持minSdkVersion指定的较低Android版本。

答案 2 :(得分:2)

像Viktor建议的那样,你可以做一个Canvas.scale()。您还可以使用BitmapDrawable(设置为View的背景)绘制位图,并为您完成缩放。