实际上,我不明白在 PNG 文件中使用 sBIT 块。
我正在存储来自 11 位/通道 RGB 源的 PNG 文件,因此我尽职尽责地在我的 (c) 代码中设置了 sBIT 块:
...
png_color_8 sig_bit;
sig_bit.gray = 0;
sig_bit.alpha = 0;
sig_bit.red = 11;
sig_bit.green = 11;
sig_bit.blue = 11;
png_set_sBIT(png_ptr, info_ptr, &sig_bit);
...
/* save the png */
Run Code Online (Sandbox Code Playgroud)
在 Windows 查看器(原生 Vista 图片查看器/Paint.net)中查看图像时,低 8 位被截断,因此我只能看到高 3 位。我原以为该sBIT
块会自动指示读者将像素左移 5 位,以 MSB 证明显示数据的合理性。似乎并非如此。
当我在我的代码中打开有或没有 sBIT 块的 png 文件时,请执行以下操作:
png_color_8p sig_bit;
if (png_get_valid(png_ptr, info_ptr, PNG_INFO_sBIT)) {
png_get_sBIT(png_ptr, info_ptr, &sig_bit);
png_set_shift(png_ptr, sig_bit);
}
Run Code Online (Sandbox Code Playgroud)
像素数据相同。
sBIT chunk的使用模型是什么?我可以以某种方式使用sBIT …
我有 bytearray,其中每三个字节描述 1 个像素(RGB)。任务是将其转换为 jpeg 或 png。
实际上,我正在使用 Zint(用于生成条形码的开源库),它使用 libpng 生成图像文件并将其保存到文件系统,但在 Zint 函数 png_plot() 中,除了生成图像外,还将其保存在磁盘上,这是不可取的。
因此,我认为有两种方法:
1. 从位图
字节数组到 bmp -> jpeg / png(使用其他一些库)2. 编写钩子或一些类似于 png_plot()
你能给我一些建议吗?谢谢你。
更新:对于@peacemaker
FILE *f;
zint_symbol *my_symbol;
my_symbol = ZBarcode_Create();
ZBarcode_Encode_and_Buffer(my_symbol, (unsigned char *)argv[1], 0, 0);
f = fopen("bitmap.bmp", "w");
fwrite(my_symbol->bitmap, sizeof(*(my_symbol->bitmap)), my_symbol->bitmap_height * my_symbol->bitmap_width, f);
ZBarcode_Delete(my_symbol);
fclose(f);
Run Code Online (Sandbox Code Playgroud) 我正在研究将多个JPEG图像作为单个较大图像存储在一起时减少存储空间的问题.基本的直觉是图像往往具有一些相似之处(比如在同一位置或大约相同的时间点拍摄的图像),我们可以利用这种相似性来节省空间吗?
总体流程为:输入JPG
图像 - >每个图像转换为RGB
图像平铺 - >重新组织相似的RGB
图块 - >再次转换为JPG
格式.当然,在检索图像时,我们需要反转该过程.
使用Y分量的DC系数作为用于区块重组的相似性度量,我获得了10个图像的约8%的空间节省.当我为100张图像执行此操作时,节省的成本降低到约3%.
如何在磁贴重组后获得节省 - 即JPEG编码过程的哪一部分利用此图像磁贴重组?
除了Y分量的DC系数之外,还有一些其他可以想到的指标,可以通过JPEG编码更好地利用
修订:
除了JPG之外还有其他一些图像格式可以在聚合多个图像时更好地利用这种相似性吗?比如PNG?
我在谷歌上找不到任何简单的方法来做到这一点。我试试这个,但make
说“没有找到目标,也没有找到生成文件。停止”。首先,我进入了lpng162/scripts
可以找到 gcc 生成文件的目录,但我是这个makefile
s 的新手,我没有 vstudio 来轻松构建它。请帮忙。我无法让它工作。我假设这个问题是为了解决我将它链接libpng16.lib
到我的 .dll 文件时的其他问题。这是我能想到的唯一解决方案。
我用 C 语言编写了一个小工具,可以根据数据库中的数据生成图像。图像为 PNG 格式,现在我需要向图像添加一些文本。我找不到任何有关如何在 PNG 图像中创建文本的示例。我正在使用 libpng 库,并且想简单地添加几行来在调用 png_write_png 之前将文本添加到图像中。
谁能给我指一个简单的“Hello World”示例,其中这两个词在图像中可见。
这可以用 libpng 来完成还是我需要使用 MagickImage 或类似的来实现这一点?
预先感谢
我是python的初学者,最近我想在我的Mac上安装autopy(Mavericks,10.9.4).我阅读了很多介绍和其他人的问题.但我仍然无法成功安装autopy.我安装autopy的步骤如下:
git clone git://github.com/msanders/autopy.git
#include <OpenGL/gl.h>
在autopy文件的第七行"src/screengrab.c"cd autopy
python setup.py build
这里有命令窗口
src/png_io.c:3:10: fatal error: 'png.h' file not found
#include <png.h>
^
1 error generated.
error: command 'cc' failed with exit status 1
Run Code Online (Sandbox Code Playgroud)
我是否需要在png_io.c中重写"png.h"的文件地址?我该如何在Mac上安装autopy?我有一些重要的遗漏吗?
我在调用 png_write_info 时观察到由于 libpng (1.6.20) 中的访问冲突导致的崩溃。我已经从源代码(包括 zlib 1.2.8)构建了 libpng,并且 libpng 源代码附带的 png 测试全部通过,没有任何错误。我可以确认在这些测试期间正在创建好的 png 文件。
我的程序的简单分解(直到它崩溃)看起来像这样。为简单起见,我删除了所有错误和边界检查:
int main(int argc, char *argv[]) {
char* filename = argv[1];
png_structp png = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
png_infop info = png_create_info_struct(png);
if (setjmp(png_jmpbuf(png)))
{
abort();
}
// Output is 16-bit depth, greyscale format.
png_set_IHDR(
png,
info,
127, 127,
16,
PNG_COLOR_TYPE_GRAY,
PNG_INTERLACE_NONE,
PNG_COMPRESSION_TYPE_DEFAULT,
PNG_FILTER_TYPE_DEFAULT
);
// do the file stuff
FILE *fp;
errno_t error = fopen_s(&fp, filename, "wb");
png_init_io(png, fp);
png_write_info(png, info); // <-- crashes …
Run Code Online (Sandbox Code Playgroud) 我正在开发一个图像绘制程序,但我对色彩空间感到非常困惑。我对伽玛的了解越多,我知道的就越少(这没有多大帮助)。
在内部,绘图程序会将图像存储为 8 位 sRGB,然后转换为 16 位线性进行合成和过滤操作。也许我应该存储 16 位线性,然后在导出时转换为 8 位 sRGB?我很想在这方面提供一些建议。目前,我不确定 Qt 将 RGB 像素解释为什么颜色空间!
据我了解,sRGB 接近大多数显示器使用的色彩空间,因此从 sRGB 转换到显示器色彩空间不会对图像数据产生太大影响。查看 sRGB 数据,就好像它在正确的色彩空间中一样可能会非常接近。
绘图程序显示 sRGB 图像。我想将这些 sRGB 图像保存到 PNG 文件中。当我在创建图像的同一台计算机上打开这个 PNG 文件(在 Mac 上使用预览)时,它看起来应该与艺术家在绘图程序中看到的完全一样,并且具有相同的颜色值(用数字颜色检查仪表)。不同的显示器和不同的操作系统使用不同的色彩空间。这些色彩空间可能不“适合”用于创建图像的系统的色彩空间。当我在不同的显示器甚至不同的计算机上打开 PNG 时,图像应该看起来尽可能与原始图像相似,但可能具有不同的颜色值。
绘图程序似乎正确显示图像(我认为)。问题是PNG。我正在使用 Qt 并使用QImage::save
. 如果我需要更多控制,我愿意使用 libPNG。
为了测试,我正在绘制一个 5x5 的图像,其中0 63 127 191 255
包含红色和绿色的颜色值。
当我使用 Digital Color Meter 对绘图程序渲染的图像进行采样时,像素值没有变化。3,3
使用 DCM 采样的像素191 191 0
应该是这样。每个像素之间都有明显的对比。
当我截取屏幕截图时,屏幕截图文件中的像素值不同。3,3
在预览中查看时使用 DCM 采样的像素为192 191 0
. 3,3
存储在文件中的像素是 …
我对 C 很陌生,需要一些关于 libpng 的帮助。我有一个用图像的 RGB 值填充的无符号字符数组,需要创建一个 .png 图像。我设法创建了一个大小合适并填充了像素值的图像,但原始图片如下所示:
我的代码是这样做的:
像素值必须存储在无符号字符数组中是否正确:像素一红色,像素一绿色,像素一蓝色,像素二红色,像素二绿色,像素二蓝色,......我是否计算下面代码中的行指针正确吗?
构建像素阵列(将 Y、Cb、Cr 值转换为 RGB):
int wcnt = 0;
for(int y = 0; y < height; y++){
for(int x = 0; x < width; x++){
rgb[wcnt] = round(1.0 * _y[y][x] + 0.0 * _cb[y][x] + 1.402 * _cr[y][x]); //red
rgb[wcnt+1] = round(1.0 * _y[y][x] + (-0.34414 * _cb[y][x]) + (-0.71414 * _cr[y][x])); //green
rgb[wcnt+2] = round(1.0 * _y[y][x] + 1.772 * _cb[y][x] + 0.0 * _cr[y][x]); //blue
wcnt = wcnt …
Run Code Online (Sandbox Code Playgroud) 我有 Dockerfile:
FROM lambci/lambda:build-nodejs10.x
RUN yum update -y
RUN yum -y install libpng12.so.0 libpng12-devel
Run Code Online (Sandbox Code Playgroud)
我构建了映像,然后在映像中执行和安装我的节点应用程序,然后执行 npm 安装。
这是deps:
"dependencies": {
"imagemin": "^5.3.1",
"imagemin-pngquant": "^5.1.0",
"sharp": "^0.22.1"
},
"devDependencies": {
"aws-sdk": "^2.36.0"
}
Run Code Online (Sandbox Code Playgroud)
npm install 有效(但仅当我在 docker 容器中安装 libpng12-devel 时):+ npm i
> sharp@0.22.1 install xxx/resize/node_modules/sharp
> (node install/libvips && node install/dll-copy && prebuild-install) || (node-gyp rebuild && node install/dll-copy)
info sharp Downloading https://github.com/lovell/sharp-libvips/releases/download/v8.7.4/libvips-8.7.4-linux-x64.tar.gz
> pngquant-bin@4.0.0 postinstall xxx/resize/node_modules/pngquant-bin
> node lib/install.js
? pngquant pre-build test passed successfully
added 434 packages from …
Run Code Online (Sandbox Code Playgroud)