1

我在重新缩放位图后遇到质量问题我从资产中加载图像,因此解码它们必须由 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
        }
}
4

2 回答 2

0

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

解决方案是使用至少与您计划在其上显示的最大屏幕大小相同的图像。您可以通过两种方式做到这一点:

  1. 找到现在位于“assets”文件夹中的图像的原始来源,并将其调整为相对较大的 android 设备屏幕的大小,例如 1280x800。不要太大,因为OutOfMemoryError当您尝试打开图像时会得到一个。
  2. 如果您的图像已经很小并且您无法访问更大的原始副本,那么我建议在放入您的“资产”文件夹之前在 Photoshop 或其他桌面图像产品中调整它的大小。与 Android 操作系统实时相比,这些成像产品在提升您的图像方面做得更好。

最后,如果您遇到OutOfMemoryError,您的选择将是:

  1. 减小图像的大小,直到在大小和显示质量之间找到可接受的平衡,或者
  2. 将您的图像从“assets”文件夹移动到标准“drawable-hdpi”、“drawable-mdpi”等目录结构中的几个不同大小的图像中。操作系统将在这些目录之一中打开一个图像,该图像与屏幕密度一致,屏幕密度更可能与硬件的堆内存能力成正比。

当然,您也可以在放大时使用BitmapFactory.Options诸如 32 位 ( ARGB444) 和抖动,但这只会在增加图像大小以进行显示时帮助很大。

于 2013-04-11T22:29:00.870 回答
0

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

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

放大时会平滑图像。

于 2013-08-12T17:02:56.617 回答