使用 BitmapFactory.decodeByteArray() 生成的图像如何调整大小

4

我正在创建一个音频播放器,我想在播放器中显示歌曲封面,当使用小图像时,它可以正常工作,但如果mp3文件有大图像,则会超出布局视图。我使用以下代码将图像重新调整为300x300:

BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inDensity = 300;
opt.inTargetDensity = 300;

songCoverView.setImageBitmap(BitmapFactory.decodeByteArray(songCover, 0, songCover.length, opt));

但它仍然显示更大并且超出了布局。
这段代码有什么问题?
3个回答

8
原来在Android中存在一个bug:decodeByteArray有时会忽略某些输入选项。已知的解决方法是使用将输入数组封装到ByteArrayInputStream中并使用decodeStream,像这样:
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inDensity = 300;
opt.inTargetDensity = 300;

songCoverView.setImageBitmap(BitmapFactory.decodeStream(new ByteArrayInputStream(songConver), null, opt));

代码示例实际上使用了decodeByteArray - 这是我的错误,显然已经更正了。 - Vlas Voloshin

7

尝试使用Bitmap.createScaledBitmap

bitmap = Bitmap.createScaledBitmap(songCover, 300, 300, true);

你可以保持旧图像的相同纵横比...我使用以下逻辑:

        int width  = songCover.getWidth();
        int height = songCover.getHeight();
        float scaleHeight = (float)height/(float)300;
        float scaleWidth  = (float)width /(float)300;
        if (scaleWidth < scaleHeight) scale = scaleHeight;
        else                          scale = scaleWidth;

        bitmap = Bitmap.createScaledBitmap(songCover, (int)(width/scale), (int)(height/scale), true);       

但是,如果图像比例不是1:1,则图像看起来像是被强制缩放到那些像素。例如,像HTML中的<img>一样具有最大宽度和最大高度。 - Muhammad Resna Rizki Pratama
1
@MuhammadResnaRizkiPratama,我已经添加了一个示例到答案中,以展示如何保持旧的纵横比。 - Ashraf Sousa

0

你可以使用 Bitmap 属性

Bitmap bitmap = Bitmap.createScaledBitmap(image, (int)x, (int)y, true);

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