如何在不模糊或使用毕加索的情况下调整图像大小

Posted

技术标签:

【中文标题】如何在不模糊或使用毕加索的情况下调整图像大小【英文标题】:how to resize an image without being blurred , or with using picasso 【发布时间】:2015-12-09 16:15:36 【问题描述】:

我需要帮助来改进我的代码。

我在做什么:主活动中有一个按钮,单击时,用户选择图像,之后,图像通过意图传递给另一个活动(add_image.java)和显示在图像视图中,然后我将图像发送到服务器。

我的问题:1)我想要将路径图像发送到第二个意图然后将其转换为图像的最佳方式 2)然后在不损失很多质量的情况下尽可能多地压缩它。 image 现在的大小是 376kb 。所以在我的应用程序中我会显示几张图片,所以在这样的尺寸下它会消耗时间和互联网来加载。(我正在使用 picasso 并且 fit() 没有减小尺寸。)

这是我的代码:

  @Override
       protected void onActivityResult(int requestCode, int resultCode, Intent data) 

           super.onActivityResult(requestCode, resultCode, data);

            if (requestCode == 1 && resultCode == RESULT_OK && data != null && data.getData() != null) 

                //file name
                filePath = data.getData();
                try 
                //  Bundle extras2 = data.getExtras();
                    bitmap  = MediaStore.Images.Media.getBitmap(getContentResolver(), filePath);
                    ByteArrayOutputStream stream = new ByteArrayOutputStream();               
                   byte imageInByte[] = stream.toByteArray();                    
                  Intent i = new Intent(this, AddImage.class);
                  i.putExtra("image", imageInByte);
                  startActivity(i);
                 catch (IOException e) 
                    e.printStackTrace();               

我在这里收到图片

     byte[] byteArray = getIntent().getByteArrayExtra("image");
            encodedImage = Base64.encodeToString(byteArray, Base64);
            bmp = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);
          ImageView imageview = (ImageView) findViewById(R.id.imageView);
            imageview.setImageBitmap(bmp);

【问题讨论】:

试试这个链接***.com/a/20824141/3678308 1) 尝试将路径发送到您将在 imageview 中显示图像的第二个活动。可以使用 putExtra(KEY, PATH_OF_IMAGE) 通过意图将路径发送到第二个活动。在接收 add_image_activity 上的路径时,您可以使用该路径来加载图像。 2)要压缩你可以检查this链接。 @avinash 我试图这样做,但它没有工作***.com/questions/32584648/… 要压缩图像,您可以使用 link 或 link。压缩图像后,您可以在图像视图中显示图像。 @avinash 感谢您提供的链接,请检查它们 【参考方案1】:

试试下面的代码,你可能需要根据你的要求修改一些参数:

创建 MainActivity 如下:

public class MainActivity extends Activity implements OnClickListener 
private final int REQUEST_IMAGE_GALLERY = 2000;

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    findViewById(R.id.button).setOnClickListener(this);


@Override
public void onClick(View v) 
    switch (v.getId()) 
    case R.id.button:
        pickImageFromGallery();
        break;

    default:
        break;
    


private void pickImageFromGallery() 
    Intent intent = new Intent(Intent.ACTION_PICK,
            android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    intent.setType("image/*");
    startActivityForResult(Intent.createChooser(intent, "Select File"),
            REQUEST_IMAGE_GALLERY);


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    // TODO Auto-generated method stub
    super.onActivityResult(requestCode, resultCode, data);

    if (resultCode != Activity.RESULT_OK) 
        return;
    

    if (requestCode == REQUEST_IMAGE_GALLERY) 
        Uri selectedImageUri = data.getData();

        String[] filePathColumn =  MediaStore.Images.Media.DATA ;
        Cursor cursor = getContentResolver().query(selectedImageUri,
                filePathColumn, null, null, null);
        cursor.moveToFirst();
        int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
        String picturePath = cursor.getString(columnIndex);
        cursor.close();

        Log.e("PATH", "" + picturePath);
        Intent intent = new Intent(this, AddImage.class);
        intent.putExtra("PATH", picturePath);
        startActivity(intent);

    


现在创建activity_main.xml如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_ >

<Button
    android:id="@+id/button"
    style="?android:attr/buttonStyleSmall"
    android:layout_
    android:layout_
    android:text="ChooseButton" />

    </LinearLayout>

然后我们需要创建 AddImage 活动如下:

public class AddImage extends Activity 
@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.add_image);
    ImageView imageView = (ImageView) findViewById(R.id.image_view);
    if (getIntent() != null) 
        String path = getIntent().getStringExtra("PATH");
        Log.e("PATHR", "" + path);
        new BitmapWorkerTask(imageView).execute(path);
    



private boolean isNeedToBeScaled(String path) 
    File file = new File(path);

    if (file.length() > (1024 * 1024) && isExist(path)) 
        Log.e("SCALEIMAGE", "SACLE");
        return true;
    
    return false;


private boolean isExist(String path) 
    File file = new File(path);
    return file.exists();


private Bitmap getScaledImage(String path) 
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(path, options);

    int srcWidth = options.outWidth;
    int srcHeight = options.outHeight;
    int[] newWH = new int[2];
    newWH[0] = srcWidth / 2;
    newWH[1] = (newWH[0] * srcHeight) / srcWidth;

    int inSampleSize = 2;
    while (srcWidth / 2 >= newWH[0]) 
        srcWidth /= 2;
        srcHeight /= 2;
        inSampleSize *= 2;

        options.inJustDecodeBounds = false;
        options.inDither = false;
        options.inSampleSize = inSampleSize;
        options.inScaled = false;
        options.inPreferredConfig = Bitmap.Config.RGB_565;
    
    Bitmap sampledSrcBitmap = BitmapFactory.decodeFile(path, options);

    return sampledSrcBitmap;


class BitmapWorkerTask extends AsyncTask<String, Void, Bitmap> 
    private final WeakReference<ImageView> imageViewReference;

    public BitmapWorkerTask(ImageView mImageView) 
        imageViewReference = new WeakReference<ImageView>(mImageView);
    

    @Override
    protected Bitmap doInBackground(String... params) 
        Bitmap scaled = null;
        if (isNeedToBeScaled(params[0])) 
            Bitmap d;

            d = getScaledImage(params[0]);
            int nh = (int) (d.getHeight() * (512.0 / d.getWidth()));
            scaled = Bitmap.createScaledBitmap(d, 512, nh, true);

         else 
            scaled = BitmapFactory.decodeFile(params[0], null);
        
        return scaled;

    

    @Override
    protected void onPostExecute(Bitmap result) 

        if (imageViewReference != null && result != null) 
            final ImageView imageView = imageViewReference.get();
            if (imageView != null) 
                imageView.setImageBitmap(result);
                imageView.setVisibility(View.VISIBLE);

            
        
    



【讨论】:

好吧,我能够做到这一点,但是我检查你的代码也许我可以增强一些东西..我接受它但是请你检查一下我现在问的这个 quetios 吗? ***.com/questions/32669433/…

以上是关于如何在不模糊或使用毕加索的情况下调整图像大小的主要内容,如果未能解决你的问题,请参考以下文章

如何在不破坏图像纵横比的情况下调整 QImage 或 QML 图像的大小以适应父容器

使用 Python - 如何在不超过原始图像大小的情况下调整裁剪图像的大小以满足纵横比

在不保持纵横比的情况下使用 mogrify 调整图像大小

如何在不使用css调整第一个图像大小的情况下在Wordpress页面上调整第二个图像的大小?

如何在不缩小图像的情况下在 Android 中调整图像大小?

如何在不损失图像质量的情况下调整图像大小以适合小型 HTML5 画布? [复制]