在Android中调整位图大小

8

我使用以下代码调整位图的大小:

FileOutputStream out = new FileOutputStream("/sdcard/mods.png");
Bitmap bmp = Bitmap.createScaledBitmap(pict, (int)(pict.getWidth() / totScale),  
    (int)(pict.getHeight() / totScale), false);
bmp.compress(Bitmap.CompressFormat.PNG, 90, out);
out.close();

我使用的从相机获取位图的代码如下:

mCamera.takePicture(null, null, null, new Camera.PictureCallback() {
        @Override
        public void onPictureTaken(byte[] data, Camera camera) {
            pict = BitmapFactory.decodeByteArray(data, 0, data.length);
        }
});

第一张图片是我在手机上(在Astro文件管理器中)可以看到的,也是我在画布上绘制位图时看到的。这在我测试过的每个设备上都发生了(HTC Legend和Galaxy Tab)。第二张图片是在我的电脑上看到的样子。是什么导致了设备上的方块?

解决方案:

以下是解决我的问题的方法: 不要使用

pict = BitmapFactory.decodeByteArray(data, 0, data.length);

我用这个替换了。
BitmapFactory.Options opts = new BitmapFactory.Options();               
opts.inPreferredConfig = Bitmap.Config.ARGB_8888;
pict = BitmapFactory.decodeByteArray(data, 0, data.length, opts);

Phone Computer


你抽出时间发布确切的解决方案并点赞,真是太棒了。 - George Freeman
2个回答

4

将其更改为true会有一些帮助。我已经阅读了文章,但是如何确保我的窗口和位图都是32位,并且都是ARGB_8888格式? - Amandeep Grewal
如果我理解正确,您包含的代码运行良好:您拍摄了照片,然后创建了一个在计算机上看起来很好的png文件。 "问题"在于您没有向我们展示的代码:您稍后用于读取和显示照片的代码。 1)请向我们展示该代码。 2)您能否让任何Android应用程序很好地显示png文件? 相册呢? 3)回答您的问题,始终使用具有允许您指定BitmapFactory选项的方法的BitmapFactory,并始终确保明确使用ARGB_8888作为inPreferredConfig。 - George Freeman
我认为这段代码是无关紧要的,因为我尝试过的任何Android应用程序(包括画廊)都会像图片中显示的那样显示块。但是,如果您认为这段代码是必要的,那么在我的onDraw中,它如下所示:canvas.setMatrix(matrix); canvas.drawBitmap(pict, 0, 0, null); - Amandeep Grewal
P.S. Divers 是正确的:png 是一种无损格式;当您使用 Bitmap.compress 和 Bitmap.CompressFormat.PNG 时,质量参数会被忽略,因此指定90看起来很松散,指定100会更好,这符合实际情况。有关详细信息,请参见此处:http://developer.android.com/reference/android/graphics/Bitmap.html - George Freeman
谢谢!指定 ARGB_888 工作了!图像现在清晰无任何块状! - Amandeep Grewal

2

第一张和第二张图片是相同的。

P.S.

bmp.compress(Bitmap.CompressFormat.PNG, 90, out);

你不能压缩PNG格式的图片,只能压缩JPEG格式的图片。


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