Android:使用比双线性更好的重采样算法调整位图大小(如Lanczos3)

Jol*_*nar 20 android bitmap bicubic image-resizing lanczos

是否有任何方法或外部库可以使用Lanczos(理想情况下)或至少bicubic alg 调整图像大小.Android下?(当然更快更好,但质量优先,处理时间次要)

我到目前为止所做的一切都是这样的:

Bitmap resized = Bitmap.createScaledBitmap(yourBitmap, newWidth, newHeight, true);
Run Code Online (Sandbox Code Playgroud)

然而,它使用双线性滤波器,输出质量很差.特别是如果你想保留细节(如细线或可读文本).

有许多优秀的Java库,例如这里讨论的: Java - 调整图像大小而不会降低质量

但是它总是依赖于Java awt类java.awt.image.BufferedImage,所以它不能在Android中使用.

有没有办法如何更改Bitmap.createScaledBitmap()方法或某些库中的默认(双线性)过滤器,如Morten Nobel的lib,它能够与android.graphics.Bitmap类一起工作(或者有一些原始表示,如评论中指出的@Tron)?

Ser*_*gio 6

最有前途的IMO是使用libswscale(来自FFmpeg),它提供Lanczos和许多其他过滤器.要从Bitmap本机代码访问缓冲区,您可以使用jnigraphics.这种方法可确保良好的性能和可靠的结果

编辑

在这里,您可以找到使用建议方法的粗略演示应用程序.目前表现令人沮丧,所以应该调查以决定我们是否要采取措施来改善它.


k3b*_*k3b 5

不幸的是,Android使用了java中不存在的android.graphics.Bitmap,而java使用了android中不存在的java.awt.image.BufferedImage :-(

我不知道a ready to use library for android如何将一个java-awt特定的lib移植到一个独立的java lib平台上,以及用于android和awt/j2se的platfrom特定处理程序

在java rescale lib中,你必须隐藏接口后面的所有java-awt特定类(如BufferedImage),IBitmap并为j2se实现该接口,并为Android独立实现.

我已成功完成exif/icc/ipc元数据处理和实现接口pixymeta-lib /.../ IBitmap.java与j2se pixymeta-j2se-lib /.../ j2se/BitmapNative.java和android pixymeta-的实现Android的LIB /.../的Android/BitmapNative.java

所以我有这些包

  • pixymeta-LIB
    • 转换平台独立的lib,其中所有awt-references都被IBitmap接口替换
  • pixymeta-J2SE-LIB
    • awt/j2se的实现 IBitmap
  • pixymeta-Android的LIB
    • android的实现 IBitmap