如果你阅读了之前的博客,你就会知道如何使用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);
旋转只是图片操作方法中的一小部分。Picasso可以通过调用Transformation
接口允许操作图片做很多操作。你可以实现Transformation
接口中的transform(android.graphics.Bitmap source)
方法。这个方法传入一个Bitmap,返回一个变换过的图片。
在你实现你自定义的转换之后,你可以简单的使用transform(Transformation transformation)
来设置Picasso请求 。这可以在图片显示之前就变换图片。
我们的方法将会实现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中。
Picasso也允许transform
的参数是列表:transform(List extends Transformation> 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你需要注意两点:
.recycle()
方法。Transformation
非常有用。你可以使用它对图片做各种变换。这是Picasso功能的巅峰。
下一篇博客,我们将会将一些关于内存有关的。