重新缩放/调整位图大小后的质量不佳

时间:2013-04-11 20:13:53

标签: android bitmap resize

重新缩放位图后我遇到了质量问题 我加载来自资产的图像,因此解码它们必须由Stream

完成

这是我的方法

  InputStream is = getAssets().open(lol.get(zpositions));   
Bitmap bm = BitmapFactory.decodeStream(is);
  Bitmap mBitmap    = Bitmap.createScaledBitmap(bm,width,hight, false);

我试过

Options options = new BitmapFactory.Options();
options.inScaled = false;
options.inPreferredConfig = Config.ARGB_8888;

Bitmap bitmapsrc = BitmapFactory.decodeStream(is, null, options);
Bitmap mBitmap  = Bitmap.createScaledBitmap(bitmapsrc,width,hight, false);

但仍然是同一个问题

任何想法如何绕过这个问题?谢谢

这是代码

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="1dip"
android:background="@android:color/black" >

<ImageView
    android:id="@+id/image"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:adjustViewBounds="true"
   />

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.fullimage);

    Display display = getWindowManager().getDefaultDisplay(); 
       width = display.getWidth();  
       height = display.getHeight(); 

       AdView adView = (AdView)findViewById(R.id.ad);
        adView.loadAd(new AdRequest());

     Intent i = getIntent();
    List<String> lol = i.getStringArrayListExtra("lol");
    this.lol = lol;
     pagerPosition = i.getExtras().getInt("id");

 {

 public Bitmap getbitBitmap() throws IOException{
    positions = MyPageChangeListener.getCurrentPage();


    if (positions == 0) {
         zpositions = pagerPosition;

    }
    InputStream is = getAssets().open(lol.get(zpositions)); 
            Options options = new BitmapFactory.Options();
            options.inScaled = false;

    Bitmap bitmapsrc = BitmapFactory.decodeStream(is, null, options);


    return bitmapsrc;

}

          private void CropWallpaper() throws IOException {
      Bitmap mBitmap    = Bitmap.createScaledBitmap(bitmapsrc,width, height, false);    
        try {
            setWallpaper(mBitmap);
            Toast.makeText(this,"Cropped successfully" ,      Toast.LENGTH_SHORT).show();   
        } catch (Exception e) {
            Toast.makeText(this,"Failed to Crop" , Toast.LENGTH_SHORT).show();
            // TODO: handle exception
        }
}

2 个答案:

答案 0 :(得分:0)

当增加图像尺寸时,图像质量总是明显降低到一定程度。因此,当您将图像缩放为“适合屏幕大小”时,“资源”文件夹中资源图像的分辨率小于显示它的屏幕。

解决方案是使用至少与您计划显示它的最大屏幕大小相同的图像。您可以通过两种方式执行此操作:

  1. 找到现在位于“资产”中的图片的原始来源 文件夹并将其调整为相对较大的android的大小 设备屏幕,例如1280x800。不要大得多,因为你 当您尝试打开图片时,我会获得OutOfMemoryError
  2. 如果您的图片已经很小,而且您无法访问更大的图片 原始副本,然后我建议在Photoshop或与之重新调整大小 在投入“资产”之前的另一个桌面成像产品 夹。这些成像产品可以更好地提升您的图像 比Android操作系统可以实时做的。
  3. 最后,如果您遇到OutOfMemoryError,您的选项将是:

    1. 缩小图像尺寸,直至找到可接受的平衡 大小和显示质量之间,或
    2. 将图像从“assets”文件夹移动到几个不同大小的图像中  标准 “drawable-hdpi”,“drawable-mdpi”等目录结构。 操作系统将在其中一个目录中打开一个图像 按照屏幕密度 更有可能与堆的内存容量成正比 硬件。
    3. 当然,您也可以使用BitmapFactory.Options(例如32位(ARGB444)并在放大时抖动,但这只会在增加图像大小以进行显示时有所帮助。

答案 1 :(得分:0)

由于您已尝试BitmapOptions的所有组合,请在创建缩放位图时尝试设置过滤器参数。

Bitmap mBitmap  = Bitmap.createScaledBitmap(bitmapsrc,width,hight, true);

在放大时平滑图像。