问题标签 [libjpeg-turbo]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
memory - jpeg无损转换 - 内存消耗?
我刚刚从http://jpegclub.org/jpegtran/下载了最新的 win32 jpegtran.exe并观察到以下内容:
我准备了一个 14500 x 10000 像素的 24 BPP jpeg 测试图像。
- 文件系统中的压缩大小约为7.5 MB。
- 解压缩到内存(使用一些图像查看器)膨胀到450 MB左右。
在无损旋转(180)期间监控 jpegtran.exe 命令行工具的内存消耗,我可以看到该进程消耗高达900 MB内存!
我会假设这种jpeg 无损转换不需要将图像文件解码到内存中,而是只需对编码文件本身执行一些数学转换 - 保持内存占用非常低。
那么以下哪项是正确的?
- 这个特定工具的实现中的一些错误
- 我错过了一些配置开关
- 我的一些误解(即jpeg无损转换也需要将图像解码到内存中?)
- “数学运算”比“将图像解码到内存”消耗更多的内存
编辑:
根据 JasonD 的回答,原因似乎是后者。所以我会扩展我的问题:
是否有任何实现可以在小块中执行这些操作(以避免高内存使用)?或者它总是需要整体完成并且没有办法解决它?
PS:
我不打算实现自己的编解码器/算法。相反,我问是否有任何满足我的要求的实现。或者至少理论上可以。
linux - 如何在 Ubuntu 12.0.4 上安装 libjpeg-turbo8
正如谷歌所建议的那样,我试图让http://jpegclub.org/jpegtran/在我的 Ubuntu 服务器上工作,但我收到了错误:
“jpegtran:加载共享库时出错:libjpeg.so.8:无法打开共享对象文件:没有这样的文件或目录”
谷歌搜索告诉我安装(通过 apt-get)libjpeg-turbo8,但是 apt-get 找不到该软件包。我自己的 Ubuntu 计算机(运行 12.0.10)可以很好地找到该软件包。
我尝试安装http://sourceforge.net/projects/libjpeg-turbo/没有运气。
我做错了什么还是我错过了什么?我如何让 jpegtran 工作?
java - Android如何通过JNi示例使用libjpeg-turbo库
由于这篇文章,我使用 ndk-build 成功构建了 libjpeg-turbo: libjpeg-turbo for android
我想在 libjpeg-turbo 的 example.c 中获得一个像 read_JPEG_file 这样的本机函数,以便从 Java 代码调用以将其用于 Android 应用程序。
有人可以给我一个例子吗?如何为使用 libjpeg-turbo ndk 构建库的 Java 编写本机方法?
我可以通过加载库
但接下来呢?该库没有任何可从 Java 调用的本机方法。
我试图根据 JNI 文档编写一个 JNI c 类,但没有成功。示例代码非常适合学习如何操作。
编辑:
我创建了一个测试类 NativeMethods:
然后我使用 javah 生成本地方法的 C 头文件,结果是com_test_app_NativeMethods.h
包含以下内容的文件:
然后我创建了一个名为的文件JPEGProcessing.c
,我将本机函数的 c 实现放置在如下位置:
文件JPEGProcessing.c
和com_test_app_NativeMethods.h
在project/jni/
文件夹中。在同一个 jni 文件夹Android.mk
中,我创建了放置这些行的文件:
从我的项目目录运行 ndk-build 后,出现了许多错误:
我不明白。如何将代码与 libjpeg-turbo 函数结合以获得工作库并在 java 中使用它?
我阅读了 NDK 说明和示例,但仍然不明白。
编辑:
带有简单本机方法的 NDK 和 JNI 工作得很好。作为测试,我使用了以下效果很好的简单方法:
我用 libjpeg-turbo 的东西试了一下,如下所示:
我得到了错误......:
那么如何将本机代码与 ndk 构建的 libjpeg-turbo 库一起使用?
java - libjpeg-turbo java 编码 jpeg
我已经在我的 Mac 上安装了 libjpeg-turbo,并将 jar 和库添加到我的 eclipse 项目中。我试图从我的缓冲图像创建 jpeg byte[]:
我得到的错误是: java.lang.Exception: tjBufSize(): Invalid argument
我使用自定义机器人创建类型为 TYPE_3BYTE_BGR 的缓冲图像。我可以使用 ImageIO 创建一个 byte[],但速度很慢。
我试图找到一些关于 java 包装器的教程,但我没有找到任何从缓冲图像编码 jpeg 的教程。如果有人可以帮助我,我将不胜感激。
ruby-on-rails - 在 Heroku Cedar Stack (Ruby buildpack) 上带有 image_optim gem 的 libjpeg
我正在尝试让image_optim gem 与 Heroku 的 Cedar 堆栈上的 Rails 4 应用程序一起使用,以优化 png/gif/jpeg 图像。
我将所需的二进制文件 ( advpng
, gifsicle
, jpegoptim
, jpegtran
, optipng
, pngcrush
, pngout
) 放入/bin
并设置ENV['PATH'] = "#{Rails.root}/bin:#{ENV['PATH']}"
在初始化程序中。这适用于 gif 和 png,但我遇到了 jpeg 的问题。
在 Rails 控制台中,我得到:
irb(main):001:0> `jpegoptim`
jpegoptim: error while loading shared libraries: libjpeg.so.8: cannot open shared object file: No such file or directory
我应该如何libjpeg
在 Heroku 上安装?
android-ndk - android应用程序中的libjpeg-turbo不使用SIMD
我按照此处的配方在我的 android 应用程序中成功编译了 libjpeg-turbo 库:libjpeg-turbo for android。
为了评估库中 NEON SIMD 指令的性能改进,我尝试启用/禁用 NEON 支持。有趣的是,没有区别。
挖掘代码,看起来init_simd()
injsimd_arm.c
永远不会在运行时执行。
libjpeg_arch_specific_init()
首次加载库时调用此函数。
我相信故障源于这个库是静态的而不是动态的,因此从未“加载”(请参阅本线程末尾的 DRC 评论:http: //sourceforge.net/p/libjpeg-turbo/patches/26/)
是否有意义?其他人看到这个问题吗?
谢谢!
java - 如何让 libjpeg-turbo 的 java 包装器实际压缩?
我无法在我的 java 项目中获取 libjpeg-turbo 来实际压缩图像。它可以很好地写入 .jpg - 但结果的最终大小总是例如与相同图像的 24 位 windows .bmp 几乎相同。一个 480x854 的图像会变成一个 1.2 兆字节的 jpeg,代码片段如下。如果我使用灰色采样,它的大小是 800Kb(而且这些图像一开始并不是花哨的图像——主要是中性背景,上面有一些填充的原色光盘,用于我正在开发的游戏)。
这是我到目前为止的代码:
我特别难以找到该项目的示例 java 使用文档;它主要假设 C 背景/用法。我不了解要传递给压缩的标志(我也不真正了解 jpeg 标准的内部结构,我也不想:)!
谢谢!
android - 如何在 ANativeWindow 上显示 JPEG?
我正在尝试使用 Android NDK 向 ANativeWindow 显示 JPEG。我正在ANativeWindow*
这样做:
我正在使用 libjpeg-turbo 加载 jpeg,方法是:
我的问题是,如何在表面上显示解码的 jpeg?我目前正在这样做:
但结果(见下文)不是我所期望的。在将缓冲区发送到表面之前我应该做什么?
谢谢
android - 使用 libjpegturbo 压缩批量图片时出现奇怪的结果
首先,我(想要)做什么:压缩和缩小一批图片(jpg)。让我们假设原始图片的尺寸为 1600w x 1200h。现在,我想要一份 1600x1200 的压缩副本以及另一份 800x600 和 400x300 的压缩副本。
我使用什么:我正在使用 libJpegTurob 来实现这一点。如果 LibJpegTurob 有问题,我会尝试使用 android 给定的方法。
已经尝试过:首先,我使用了从 Tom Gall ( https://github.com/jberkel/libjpeg-turbo ) 移植的 Java Wrapper。
在我开始使用超过 4mb 的图片之前,一切都很好(在 nexus 4 上)。基本上发生的是 android 抛出 OutOfMemory 异常。当我使用较小的图片(~1-2mb)但一张又一张地压缩时,就会发生这种情况。
在像 nexus s 这样内存较低的预算设备上运行它之后,情况变得更糟。低堆引起的问题,这就是我的想法。
那么,我想,我必须用c来做。只要我在预算设备上使用小于 3mb 的图片,内存问题似乎就解决了。在 nexus 4 上,我什至可以压缩 >15mb 的图片。
这是src图片。
但是现在……问题。第一张压缩图看起来不错
但所有其他的看起来像这样
或这样
只要我保留选择的图片并压缩它们,就会发生这种情况。
现在是代码。
这是缩放和压缩发生的地方
开始压缩的Java部分..
我做错了什么???
非常感谢!!
PS对不起英语不好!
c++ - turbojpeg cpp中的realloc图像缓冲区
我正在使用 turbojpeg 来阅读图像。
我正在做一些事情:
我想重新分配 m_data 和 c_jpeg_buffer 以防 _jpegSize 或 (tj_width*tj_height) 太大。turbojpeg 文档表明,如果我使用 tjCompress2(...) 或 tjTransform(...),这将自动发生。它没有说明在这种情况下会发生什么。假设我重新分配缓冲区 - 使用 tjFree() 是否仍然安全?