Android版BitmapFactory.Options的实现

时间:2013-07-18 18:43:39

标签: java android bitmap imageview

我有60张图片用于我的应用。每张图片的尺寸仅为(约)25KB。我对大写使用单字母命名约定,对小写使用双字母。

  

a.png

     

aa.png

在我的布局中,我有10个ImageView,我按照从数据库中提取的单词以编程方式设置图像位图。

我的问题是,我可能没有正确实施羽绒采样。我将所有10个ImageView添加到ImageView数组,然后找到它们根据数据库中单词的字符数组设置它们的位图值。这是我设置图像视图的方法:

for(int j = 0; j < myWord.length(); j++){

    char[] chars = myWord.toCharArray();
    if(Character.isUpperCase(chars[j])){

        int imgID = getResources().getIdentifier(String.valueOf(chars[j]).toLowerCase(), "drawable", getPackageName());

        letters[j].setTag(String.valueOf(chars[j]).toUpperCase());

        letters[j].setImageBitmap(CalculateSize.decodeSampledBitmapFromResource(getResources(), imgID, 75, 75));

    }else if(Character.isLowerCase(chars[j])){

        int imgID = getResources().getIdentifier(String.valueOf(chars[j]) + String.valueOf(chars[j]), "drawable", getPackageName());

        letters[j].setTag(chars[j] + chars[j]);

        letters[j].setImageBitmap(CalculateSize.decodeSampledBitmapFromResource(getResources(),imgID, 75, 75));


}

以下是我调整大小的方法。我得到了一个带有inSampleSize = 4设置的3个字母的单词。但是,无论我将它设置为什么,我都无法再次使用它:

    public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight){

        // Height and Width of image
        final int height = options.outHeight;
        final int width = options.outWidth;
        int inSampleSize = 12;

        if (height > reqHeight || width > reqWidth) {

            // Calculate ratios of height and width
            final int heightRatio = Math.round((float) height / (float) reqHeight);
            final int widthRatio = Math.round((float) width / (float) reqWidth);

            // Choose smallest ratio as inSampleSize value.
            inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
        }



        return inSampleSize;


    }


    public static Bitmap decodeSampledBitmapFromResource(Resources res, int resID, int reqWidth, int reqHeight){

        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeResource(res, resID, options);

        options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

        options.inJustDecodeBounds = false;
        return BitmapFactory.decodeResource(res, resID, options);


    }



}

1 个答案:

答案 0 :(得分:0)

最终我认为答案是使用更小的图像。

我在我的代码中添加了调试日志记录,它在采样之前给出了每个图像的高度和宽度,然后它给出了我选择的最小比率。

每张图片达到了930 x 1110 dp,我试图以1/12的大小对其进行采样,在崩溃之前仍然将堆增加到42MB +。

我认为我需要做的是将图像大小调整为现在大小的1/4,并将那些缩小一半,甚至1/4。

我可以为阅读它的8个人更新此问题,以便通知您是否有效。

修改:更新了图片的原始大小,这完美无瑕。