欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

关于 android P ImageDecoder 的使用讲解

程序员文章站 2022-05-14 08:23:38
 一个的可以将png, jpeg, webp, gif, or heif 格式的图片的转换成drawable 或者bitmap 对象的类。 要使用它, 首先使用createsource 创...

 一个的可以将png, jpeg, webp, gif, or heif 格式的图片的转换成drawable 或者bitmap 对象的类。

要使用它, 首先使用createsource 创建一个source, 例如解码一个文件使用createsource(file) ,将返回值传入decodedrawable(source) 或者 decodebitmap(source):

 file file = new file(...);
  imagedecoder.source source = imagedecoder.createsource(file);
  drawable drawable = imagedecoder.decodedrawable(source);

source是可以复用的方需要,将图片解码成不同的形态,例如修改宽高。

第二方法还可以传递onheaderdecodedlistener,这里imageinfo存放的是原始的图片的宽和高。可以修改用来修改图片宽高的时候修改samplesize。

 onheaderdecodedlistener listener = new onheaderdecodedlistener() {
public void onheaderdecoded(imagedecoder decoder, imageinfo info, source source) {
 decoder.settargetsamplesize(2);
}
  };
  drawable drawable = imagedecoder.decodedrawable(source, listener);

如果要解码的图片是gif,会被解码成animatedimagedrawable 使用方法如下:

  drawable drawable = imagedecoder.decodedrawable(source);
  if (drawable instanceof animatedimagedrawable) {
((animatedimagedrawable) drawable).start();
  }

默认解码出来的bitmap是不可变,但是仍然可以使用postprocessor来添加一些自定义的效果,例如:

  drawable drawable = imagedecoder.decodedrawable(source, (decoder, info, src) -> {
decoder.setpostprocessor((canvas) -> {
  // this will create rounded corners.
  //创建圆角照片
  path path = new path();
  path.setfilltype(path.filltype.inverse_even_odd);
  int width = canvas.getwidth();
  int height = canvas.getheight();
  path.addroundrect(0, 0, width, height, 20, 20, path.direction.cw);
  paint paint = new paint();
  paint.setantialias(true);
  paint.setcolor(color.transparent);
  paint.setxfermode(new porterduffxfermode(porterduff.mode.src));
  canvas.drawpath(path, paint);
  return pixelformat.translucent;
});
  });

如果解码的照片是不完整的或者包含错误,解码的时候会抛出decodeexception,一些情况下,可能已经解码出一部分的照片,这个时候传递onpartialimagelistener ,并返回true,就只显示解码出来的部分,剩余部分使用空白代替。

 drawable drawable = imagedecoder.decodedrawable(source, (decoder, info, src) -> {
decoder.setonpartialimagelistener((decodeexception e) -> {
  // returning true indicates to create a drawable or bitmap even
  // if the whole image could not be decoded. any remaining lines
  // will be blank.
  return true;
});
  });

有错误的地方,欢迎指正,谢谢。