【问题标题】:bitmap bad quality after set to imageview设置为 imageview 后的位图质量不佳
【发布时间】:2016-02-11 23:55:58
【问题描述】:

我正在创建一个为用户打开相机的应用程序,捕获图像后它将显示在 ImageView 上!但是 ImageView 中的图像质量很差
这是代码:

public class Camera extends AppCompatActivity implements View.OnClickListener {

ImageView imgView;
Button camera, setBackground;

Intent i;

int cameraData = 0;

Bitmap bitmap;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.camera);
    initialize();
}

private void initialize() {
    imgView = (ImageView) findViewById(R.id.bPicture);
    camera = (Button) findViewById(R.id.bOpenCamera);
    setBackground = (Button) findViewById(R.id.bSetBackground);

    camera.setOnClickListener(this);
    setBackground.setOnClickListener(this);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(resultCode == RESULT_OK){
        Bundle extras = data.getExtras();
        bitmap = (Bitmap) extras.get("data");

        Bitmap resizedBmp = Bitmap.createScaledBitmap(bitmap, imgView.getWidth(),imgView.getHeight(), false);
        imgView.setImageBitmap(resizedBmp);
    }
}

@Override
public void onClick(View v) {
    switch(v.getId()){
        case R.id.bOpenCamera:
            i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(i, cameraData);
            break;
        case R.id.bSetBackground:
            try {
                WallpaperManager wallmngr = WallpaperManager.getInstance(this);
                wallmngr.setBitmap(bitmap);
            } catch (IOException e) {
                e.printStackTrace();
            }
            break;
    }
}

}

我应该怎么做才能提高图像质量?

【问题讨论】:

    标签: android bitmap


    【解决方案1】:

    使用缩略图以外的东西。引用the documentation for ACTION_IMAGE_CAPTURE,并强调:

    调用者可能会传递一个额外的 EXTRA_OUTPUT 来控制此图像的写入位置。如果 EXTRA_OUTPUT 不存在,则在额外字段中将小尺寸图像作为位图对象返回。这对于只需要小图像的应用程序很有用。 如果存在 EXTRA_OUTPUT,则将全尺寸图像写入 EXTRA_OUTPUT 的 Uri 值。

    因此,在EXTRA_OUTPUT 中指定一个Uri,将完整的相机图像写入其中。然后,使用an image-loading library,如Picasso,将照片加载到您的ImageView

    Here is a sample app 演示使用EXTRA_OUTPUT

    【讨论】:

    • 图片在ImageView中旋转显示! link
    • 为什么我应该使用图像加载库?@commonsware
    • @amir:如果您想管理后台线程,BitmapFactory.Options#inSampleSize 以及您自己的所有这些,当然欢迎您。我建议使用图像加载库。
    【解决方案2】:

    这就是我让它为我工作的方式!假设您正在捕获图像,并希望在新的 Activity 中显示捕获的图像,您可以按照以下方式进行操作:

    首先点击按钮,您可以:

     public void cameraFuture(View view) // <-- onClick() method of Camera Button
    {
        Intent intent= new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        File file = new File(Environment.getExternalStorageDirectory(),
                "MyPhoto.jpg");
        outPutfileUri = Uri.fromFile(file);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, outPutfileUri);
        startActivityForResult(intent, TAKE_PIC);
    }
    

    那么在onActivityResult()方法上,你可以这样做:

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == TAKE_PIC && resultCode==RESULT_OK){
            Toast.makeText(this, outPutfileUri.toString(),Toast.LENGTH_LONG).show();
            
            Intent bitIntent = new Intent(this, CameraTake.class);
            bitIntent.putExtra("imageUri", outPutfileUri);
            startActivity(bitIntent);
            finish();
    
          
        }
    
    }
    

    而在下一个Activity中,你可以通过这种方式接收文件:

    Intent receiveIntent = getIntent();
    
        uri = receiveIntent.getParcelableExtra("imageUri");
    
    
        if (savedInstanceState == null) {
            Bundle extras = getIntent().getExtras();
            if(extras == null) {
                receiveImg= null;
            } else {
                receiveImg= extras.getString("PASSER");
            }
        } else {
            receiveImg= (String) savedInstanceState.getSerializable("PASSER");
        }
    
    
    
    
        File imgFile = new  File(Environment.getExternalStorageDirectory(),"MyPhoto.jpg");
    
        if(imgFile.exists()){
    
            Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
    
            ImageView myImage = (ImageView) findViewById(R.id.camOut);
    
            myImage.setImageBitmap(myBitmap);
    
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-16
      • 2013-02-25
      • 1970-01-01
      • 1970-01-01
      • 2018-01-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多