问题标签 [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.

0 投票
1 回答
560 浏览

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:
我不打算实现自己的编解码器/算法。相反,我问是否有任何满足我的要求的实现。或者至少理论上可以。

0 投票
1 回答
2366 浏览

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 工作?

0 投票
4 回答
7376 浏览

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.ccom_test_app_NativeMethods.hproject/jni/文件夹中。在同一个 jni 文件夹Android.mk中,我创建了放置这些行的文件:

从我的项目目录运行 ndk-build 后,出现了许多错误:

我不明白。如何将代码与 libjpeg-turbo 函数结合以获得工作库并在 java 中使用它?

我阅读了 NDK 说明和示例,但仍然不明白。

编辑:

带有简单本机方法的 NDK 和 JNI 工作得很好。作为测试,我使用了以下效果很好的简单方法:

我用 libjpeg-turbo 的东西试了一下,如下所示:

我得到了错误......:

那么如何将本机代码与 ndk 构建的 libjpeg-turbo 库一起使用?

0 投票
1 回答
1433 浏览

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 的教程。如果有人可以帮助我,我将不胜感激。

0 投票
3 回答
1379 浏览

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 上安装?

0 投票
0 回答
411 浏览

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/

是否有意义?其他人看到这个问题吗?

谢谢!

0 投票
1 回答
1260 浏览

java - 如何让 libjpeg-turbo 的 java 包装器实际压缩?

我无法在我的 java 项目中获取 libjpeg-turbo 来实际压缩图像。它可以很好地写入 .jpg - 但结果的最终大小总是例如与相同图像的 24 位 windows .bmp 几乎相同。一个 480x854 的图像会变成一个 1.2 兆字节的 jpeg,代码片段如下。如果我使用灰色采样,它的大小是 800Kb(而且这些图像一开始并不是花哨的图像——主要是中性背景,上面有一些填充的原色光盘,用于我正在开发的游戏)。

这是我到目前为止的代码:

我特别难以找到该项目的示例 java 使用文档;它主要假设 C 背景/用法。我不了解要传递给压缩的标志(我也不真正了解 jpeg 标准的内部结构,我也不想:)!

谢谢!

0 投票
1 回答
3133 浏览

android - 如何在 ANativeWindow 上显示 JPEG?

我正在尝试使用 Android NDK 向 ANativeWindow 显示 JPEG。我正在ANativeWindow*这样做:

我正在使用 libjpeg-turbo 加载 jpeg,方法是:

我的问题是,如何在表面上显示解码的 jpeg?我目前正在这样做:

但结果(见下文)不是我所期望的。在将缓冲区发送到表面之前我应该​​做什么?

快照

谢谢

0 投票
2 回答
1316 浏览

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对不起英语不好!

0 投票
1 回答
452 浏览

c++ - turbojpeg cpp中的realloc图像缓冲区

我正在使用 turbojpeg 来阅读图像。

我正在做一些事情:

我想重新分配 m_data 和 c_jpeg_buffer 以防 _jpegSize 或 (tj_width*tj_height) 太大。turbojpeg 文档表明,如果我使用 tjCompress2(...) 或 tjTransform(...),这将自动发生。它没有说明在这种情况下会发生什么。假设我重新分配缓冲区 - 使用 tjFree() 是否仍然安全?