حل مشکل rotate شدن عکس های گرفته شده توسط دوربین در اندروید (کتابخانه Picasso برای اندروید)

با سلام،

یکی از مشکلات کار کردن با دوربین در اندروید و set کردن تصویر گرفته شده برای یک ImageView اینه که تصویر گرفه شده به صورت rotate شده روی ImageView قرار می گیرد.

برای حل این مشکل من کتابخانه کار با عکس پیکاسو Picasso رو پیشنهاد می کنم.

قدم اول نصب این کتابخونه است که برای Android Studio خیلی ساده و کافیه که داخل فایل Build.gradle خط زیر را اضافه کنید (داخل Dependencies):

compile 'com.squareup.picasso:picasso:2.3.3'

حال اون جایی که تصویر را به ImageView می دادید را باید تغییر بدید.

imageUserProfile = (ImageView) findViewById(R.id.user_profile_photo);

Picasso.with(this).load("file:" + mCurrentPhotoPath).into(imageUserProfile);

mCurrentPhotoPath :آدرس نگهداری تصویر گرفته شده توسط دوربین هست.

حال من نیاز داشتم تا تصویری که میخوام داخل ImageView نمایش بدم به صورت گرد شده (Circle) باشه. برای این کار باز میشه از کتابخانه Picasso استفاده کرد.

اول یه کلاس جاوا به اسم CircleTransform می سازیم:

package arisa_co.com.appwithnav.Utils;

import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Paint;

import com.squareup.picasso.Transformation;

public class CircleTransform implements Transformation {
    @Override
    public Bitmap transform(Bitmap source) {
        int size = Math.min(source.getWidth(), source.getHeight());

        int x = (source.getWidth() - size) / 2;
        int y = (source.getHeight() - size) / 2;

        Bitmap squaredBitmap = Bitmap.createBitmap(source, x, y, size, size);
        if (squaredBitmap != source) {
            source.recycle();
        }

        Bitmap bitmap = Bitmap.createBitmap(size, size, source.getConfig());

        Canvas canvas = new Canvas(bitmap);
        Paint paint = new Paint();
        BitmapShader shader = new BitmapShader(squaredBitmap,
                BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP);
        paint.setShader(shader);
        paint.setAntiAlias(true);

        float r = size / 2f;
        canvas.drawCircle(r, r, r, paint);

        squaredBitmap.recycle();
        return bitmap;
    }

    @Override
    public String key() {
        return "circle";
    }
}

حال اونجایی که تصویر را روی ImageView تنظیم می کنید اول کلاس بالا را import کنید و سپس از خط زیری استفاده کنید:

Picasso.with(this).load("file:" + mCurrentPhotoPath).transform(new CircleTransform()).into(imageUserProfile);

کتابخانه پییکاسو