相关疑难解决方法(0)

Android捏缩放大图像,内存高效而不丢细节

我的应用程序必须显示许多高分辨率图像(约1900*2200像素),支持捏缩放.为避免内存不足错误,我计划使用解码图像以显示全屏

options.inSampleSize = scale (scale was calculated as Power of 2 as Document)
Run Code Online (Sandbox Code Playgroud)

(我使用的观点是TouchImageView延伸的ImageView)

所以我可以快速加载图像并在屏幕(图像)之间平滑滑动.但是,当我捏​​缩放时,我的应用程序因缩放图像而丢失细节.如果我加载完整图像,我无法快速加载或平滑滑动,捏缩放后拖动.然后我尝试仅在用户开始捏缩放时加载完整图像,但由于图像非常大,我仍然无法平滑地拖动图像.Android画廊甚至可以完美地实现8Mpx图像.

任何人都可以帮助我.提前致谢

android out-of-memory large-files imageview pinchzoom

11
推荐指数
2
解决办法
3541
查看次数

在Android上使用JNI进行图像解码和操作

背景

在某些应用程序中,处理没有OOM的大型图像以及快速处理这些图像非常重要.

为此,JNI(或令人遗憾地缺乏文档的renderscript)可以是一个很好的解决方案.

在过去,我成功地使用JNI来旋转巨大的位图,同时避免使用OOM(链接在这里,这里这里).这是一个很好的(但很烦人)经验,但最终它的工作.

问题

android框架有很多处理位图的功能,但我不知道JNI方面的情况如何.

我已经知道如何将位图从android的"java世界"传递到"JNI世界"并返回.

我不知道的是我可以在JNI端使用哪些功能来帮助我使用位图.

我希望能够在JNI上进行所有图像操作(包括解码),这样我在呈现大图像时就不用担心OOM了,在这个过程的最后,我可以将数据转换为Java-位图(显示用户)和/或将其写入文件.

再次,我不想将JNI端的数据转换为java位图,只是为了能够运行这些操作.

事实证明,有一些库提供了许多功能(如JavaCV),但是它们非常大,我不太确定它们的功能,如果它们真的在JNI端进行解码,所以我更喜欢能够通过Android的内置JNI功能知道什么是可能的.

这个问题

哪些功能可以在Android上的JNI端进行图像处理?

例如,我如何在位图上运行面部检测,应用矩阵,下采样位图,缩放位图等等?

对于某些操作,我已经可以想到一种实现它们的方法(缩放图像非常简单,维基百科可以提供很多帮助),但有些操作非常复杂.

即使我自己实现了这些操作,也许其他人已经提高了效率,想到了C/C++可以拥有的那么多优化.

当我去Android的JNI方面时,我真的是靠自己,我需要从头开始实现每一个方面吗?

为了说清楚,我感兴趣的是:

在java上输入位图 - >纯粹在JNI和C/C++中的图像处理(无论如何都没有转换为java对象) - >在java上输出位图.

c++ java-native-interface android image-manipulation bitmap

8
推荐指数
1
解决办法
4592
查看次数

在Android上集成或构建libjpeg-turbo的说明

可以在互联网上找到各种页面,提到Android的libjpeg-turbo(例子).他们都在这里指向存储库,并说要阅读ANDROID.txt构建指令.但是,存储库中没有这样的文本文件.这个存储库是获取Android的libjpeg-turbo的官方地方吗?如果是这样,构建/集成指令在哪里?

java-native-interface android jpeg android-ndk libjpeg-turbo

6
推荐指数
2
解决办法
3798
查看次数

如何在Android上旋转JPEG文件而不会降低质量并获得文件大小?

背景

我需要旋转相机拍摄的图像,以便它们始终具有正常方向.

为此,我使用下一个代码(使用此帖子来获取图像方向)

//<= get the angle of the image , and decode the image from the file
final Matrix matrix = new Matrix();
//<= prepare the matrix based on the EXIF data (based on https://gist.github.com/9re/1990019 )
final Bitmap rotatedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(),matrix,false);
bitmap.recycle();
fileOutputStream = new FileOutputStream(tempFilePath);
rotatedBitmap.compress(CompressFormat.JPEG, 100, fileOutputStream);
rotatedBitmap.recycle();
Run Code Online (Sandbox Code Playgroud)

这里压缩率(AKA"质量"参数)是100.

问题

代码工作正常,但结果比原来大,大得多.

原始文件大约为600-700 KB,而生成的文件大约为3MB ...

即使输入文件和输出文件都具有相同的格式(JPEG),这也是如此.

相机设置为"超精细"质量.不确定它意味着什么,但我认为这与压缩率有关.

我试过的

我试图将"filter"参数设置为false或true.两者都导致了大文件.

即使没有旋转本身(只是解码和编码),我也会获得更大的文件大小......

只有当我将压缩比设置为大约85时,我才会得到类似的文件大小,但我想知道与原始文件相比质量会受到什么影响.

这个问题

它为什么会发生?

有没有办法获得完全相同的输入文件的大小和质量?

使用与原始文件相同的压缩率会使它发生吗?甚至可以获得原始文件的压缩率?

拥有100%压缩率意味着什么?


编辑:我发现这个链接谈论JPEG文件的旋转而不会丢失质量和文件大小,但在Android上是否有解决方案?

这是另一个链接,说它是可能的,但我找不到任何允许旋转jpeg文件而不会失去其质量的库

android jpeg image image-compression

6
推荐指数
1
解决办法
7234
查看次数

Android 如何使用 libjpeg-turbo 库

我终于成功构建了 libjpeg-turbo 静态库,感谢这个适用 于 Android 的 libjpeg-turbo 现在我有一个由 ndk-build 生成的 libjpeg.a 和 libsimd.a

但我无法找到有关下一步该做什么的任何信息?我使用 BitmapFactory 中的构建将 jpeg 从缓冲区(从套接字)解码为位图,效果很好

byte[] jpgBits = new byte[jpgBitsLen];
dis.readFully(jpgBits);
Bitmap bmp = BitmapFactory.decodeByteArray(jpgBits, 0, jpgBitsLen);
Run Code Online (Sandbox Code Playgroud)

如何用 libjpeg-turbo 替换 BitmapFactory.decodeByteArray?

我用这个在我的电脑上编码流

tjhandle rmfdJpegCompressor = tjInitCompress();
tjCompress2(rmfdJpegCompressor, (unsigned char *)s_rmfdPixels, MFD_WH, 0, MFD_WH, TJPF_BGRX,
            &rmfdBits, &rmfdBitsLen, TJSAMP_420, RMFD_JPEG_QUALITY,
            0);
tjDestroy(rmfdJpegCompressor);
Run Code Online (Sandbox Code Playgroud)

哪个工作得很好,所以我想一定有一个 Android 等效的?

我读了这个 https://wiki.linaro.org/BenjaminGaignard/libjpeg-turboAndSkia ,这是否意味着使用它的唯一方法是重建android源代码,以便它使用libjpeg-turbo?我在某处读到有一个兼容性 api 和 libjpeg-turbo 的本机 api,我很高兴使用任何最简单的 api,因为我不喜欢重建 android

我尝试了以下操作:在我的项目根目录下,我创建了文件夹 jni/include 并将turbojpeg.h 放入其中 在我的项目根目录下我创建了文件夹 jni/prebuilt 并将 libjpeg.a 放入其中

在我的java代码中,我把

private native int tjInitDecompress(); …
Run Code Online (Sandbox Code Playgroud)

android android-ndk

3
推荐指数
1
解决办法
5483
查看次数