Picasso入门教程(十)图片旋转和变换

如果你阅读了之前的博客,你就会知道如何使用Picasso加载图片和处理图片。到目前为止,我们的图片还是untouched状态(我们希望resize 和 scale图片,这样可以让图片更合适一些)这篇博客会讲图片的操作。

图片旋转

在我们学习高级图片变化之前,你需要先学习一些图片旋转。Picasso支持图片旋转。有两种图片旋转:简单的旋转和复杂的旋转

简单旋转

简单旋转需要这样调用一个方法:rotate(float degrees) 。 这个方法通过用户传入的角度进行图片旋转。这个角度是大于0小于360度。(0度和360度对于图片来说是不动的)来看一下例子:

Picasso
    .with(context)
    .load(UsageExampleListViewAdapter.eatFoodyImages[0])
    .rotate(90f)
    .into(imageViewSimpleRotate);

这会将图片旋转90度。

复杂旋转

默认情况下,旋转中心(pivot point)是(0,0)的位置。有时候你可能需要在一个特定的旋转中心旋转图片,而不是在(0,0)处。你可以调用下面那个方法来实现:

rotate(float degrees, float pivotX, float pivotY)

现在加载图片的代码变成了下面那个:

Picasso
    .with(context)
    .load(R.drawable.floorplan)
    .rotate(45f, 200f, 100f)
    .into(imageViewComplexRotate);

变换(Transformation)

旋转只是图片操作方法中的一小部分。Picasso可以通过调用Transformation 接口允许操作图片做很多操作。你可以实现Transformation 接口中的transform(android.graphics.Bitmap source) 方法。这个方法传入一个Bitmap,返回一个变换过的图片。
在你实现你自定义的转换之后,你可以简单的使用transform(Transformation transformation) 来设置Picasso请求 。这可以在图片显示之前就变换图片。

例子1:Blurring an Image

我们的方法将会实现Transformation这个接口,下面是例子:

public class BlurTransformation implements Transformation {

    RenderScript rs;

    public BlurTransformation(Context context) {
        super();
        rs = RenderScript.create(context);
    }

    @Override
    public Bitmap transform(Bitmap bitmap) {
        // Create another bitmap that will hold the results of the filter.
        Bitmap blurredBitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);

        // Allocate memory for Renderscript to work with
        Allocation input = Allocation.createFromBitmap(rs, blurredBitmap, Allocation.MipmapControl.MIPMAP_FULL, Allocation.USAGE_SHARED);
        Allocation output = Allocation.createTyped(rs, input.getType());

        // Load up an instance of the specific script that we want to use.
        ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
        script.setInput(input);

        // Set the blur radius
        script.setRadius(10);

        // Start the ScriptIntrinisicBlur
        script.forEach(output);

        // Copy the output to the blurred bitmap
        output.copyTo(blurredBitmap);

        bitmap.recycle();

        return blurredBitmap;
    }

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

同样,我们需要将transformation 加到Picasso的请求中:

Picasso
    .with(context)
    .load(UsageExampleListViewAdapter.eatFoodyImages[0])
    .transform(new BlurTransformation(context))
    .into(imageViewTransformationBlur);

执行这段代码之后,图片将会被模糊化呈现在ImageView中。

例子2:Blurring and Gray-Scaling an Image

Picasso也允许transform 的参数是列表:transform(List transformations) 这意味着你可以对image做一系列的变化。
这个例子我们对图片添加一个gray-scaling的变换。代码实现如下:

public class GrayscaleTransformation implements Transformation {

    private final Picasso picasso;

    public GrayscaleTransformation(Picasso picasso) {
        this.picasso = picasso;
    }

    @Override
    public Bitmap transform(Bitmap source) {
        Bitmap result = createBitmap(source.getWidth(), source.getHeight(), source.getConfig());
        Bitmap noise;
        try {
            noise = picasso.load(R.drawable.noise).get();
        } catch (IOException e) {
            throw new RuntimeException("Failed to apply transformation! Missing resource.");
        }

        BitmapShader shader = new BitmapShader(noise, REPEAT, REPEAT);

        ColorMatrix colorMatrix = new ColorMatrix();
        colorMatrix.setSaturation(0);
        ColorMatrixColorFilter filter = new ColorMatrixColorFilter(colorMatrix);

        Paint paint = new Paint(ANTI_ALIAS_FLAG);
        paint.setColorFilter(filter);

        Canvas canvas = new Canvas(result);
        canvas.drawBitmap(source, 0, 0, paint);

        paint.setColorFilter(null);
        paint.setShader(shader);
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY));

        canvas.drawRect(0, 0, canvas.getWidth(), canvas.getHeight(), paint);

        source.recycle();
        noise.recycle();

        return result;
    }

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

如果你想对图片添加多个变换,你可以放到一个list中,然后将list传给Picasso。代码如下:

List transformations = new ArrayList<>();

transformations.add(new GrayscaleTransformation(Picasso.with(context)));
transformations.add(new BlurTransformation(context));

Picasso
    .with(context)
    .load(UsageExampleListViewAdapter.eatFoodyImages[0])
    .transform(transformations)
    .into(imageViewTransformationsMultiple);

Transformation应该会给你提供足够的方法进行图片变换。在实现Transformation你需要注意两点:

  • 如果不需要变换的话,那就返回原始的图片
  • 当创建一个新的Bitmap的时候,旧的Bitmap要调用.recycle() 方法。

总结

Transformation 非常有用。你可以使用它对图片做各种变换。这是Picasso功能的巅峰。
下一篇博客,我们将会将一些关于内存有关的。

你可能感兴趣的:(android)