16位灰度PNG

2024-02-05

我正在尝试编写(使用 libpng)一个 16 位灰度图像,其中每个点颜色等于其坐标之和。以下代码应生成 16 位 PNG,但会生成 8 位,例如this http://dl.dropbox.com/u/15187698/test.png. Why?

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <png.h>

void save_png(FILE* fp, long int size)
{
    png_structp png_ptr = NULL;
    png_infop info_ptr = NULL;
    size_t x, y;
    png_bytepp row_pointers;

    png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
    if (png_ptr == NULL) {
        return ;
    }

    info_ptr = png_create_info_struct(png_ptr);
    if (info_ptr == NULL) {
        png_destroy_write_struct(&png_ptr, NULL);
        return ;
    }

     if (setjmp(png_jmpbuf(png_ptr))) {
        png_destroy_write_struct(&png_ptr, &info_ptr);
        return ;
    }

    png_set_IHDR(png_ptr, info_ptr,
                 size, size, // width and height
                 16, // bit depth
                 PNG_COLOR_TYPE_GRAY, // color type
                 PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);

    /* Initialize rows of PNG. */
    row_pointers = (png_bytepp)png_malloc(png_ptr,
        size*png_sizeof(png_bytep));

    for (int i=0; i<size; i++)
       row_pointers[i]=NULL;

    for (int i=0; i<size; i++)
       row_pointers[i]=png_malloc(png_ptr, size*2);

    //set row data
    for (y = 0; y < size; ++y) {
        png_bytep row = row_pointers[y];
        for (x = 0; x < size; ++x) {
                short color = x+y;
                *row++ = (png_byte)(color & 0xFF);
                *row++ = (png_byte)(color >> 8);
        }
    }

    /* Actually write the image data. */
    png_init_io(png_ptr, fp);
    png_set_rows(png_ptr, info_ptr, row_pointers);
    png_write_png(png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY, NULL);
    //png_write_image(png_ptr, row_pointers);

    /* Cleanup. */
    for (y = 0; y < size; y++) {
        png_free(png_ptr, row_pointers[y]);
    }
    png_free(png_ptr, row_pointers);
    png_destroy_write_struct(&png_ptr, &info_ptr);
}

int main()
{
  FILE* f;
  if((f=fopen("test.png", "wb"))!=NULL)
  {
    save_png(f, 257);

    fclose(f);
  }
  return 0;
}

链接到的图像在 Windows 7 的“属性”中显示为“16 位”。我想您只是看到各种应用程序回退到转换为 8 位进行显示,这(我猜)是预料之中的,因为大多数显示设备不支持 16 位。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

16位灰度PNG 的相关文章

  • Visual Studio 2013 和 libpng [重复]

    这个问题在这里已经有答案了 我正在尝试使用 VS2013 在 C 中使用 libpng 编写一个简单的 PNG 文件 我从 Nuget 安装了 libpng 并包含了 png h 但无法编译 我得到这个作为我的输出 1 gt main ob
  • 使用 Win32 / C++ 读取 PNG

    没有simple在本机 Windows 中将 PNG 文件读入内存位图的方法似乎是不可能的 但经过多次谷歌搜索后我开始相信它 libpng zlib 组合太大了 有任何第三方库 Win32 库可以读取 PNG 吗 编辑 boost gil
  • 将图像导入 Android Studio,显示为深灰色

    我正在尝试将图像导入 Android Studio 然后将其用作我的应用程序的背景 我右键单击 res 文件夹并导入资源 接下来我选择操作栏和选项卡图标 在这里我在我的电脑上找到图像文件 然后将其导入到我的项目中 当它导入时 所有预览都是深
  • 在 PyGTK 中,显示 PNG 文件的简单方法是什么?

    以下 PyGTK 代码在窗口中显示 PNG 文件 是否有更简单或更好的方式来显示 PNG 文件 例如使用 gtk DrawingArea 例如 如何调整文件大小 import gtk import pygtk pygtk require 2
  • 获取 png 图像的像素的 alpha 值?

    我正在使用以下代码 img imagecreatefrompng image png col imagecolorat img x y alpha col gt gt 24 0x7F 但 alpha 值始终为 127 即使像素位于 x y
  • 如何使用 c 使用 libpng 更改 png 图像的 RGB 值?

    更改 png 图像的 rgb 值的推荐方法是什么 现在我正在使用示例代码来查看 libpng 的工作方式 它只打开一个 png 图像并写入另一个 png 图像 但是我想更改这个新图像的 RGB 值 使其变为全蓝色 绿色或红色 无论我选择什么
  • openGL转png

    我正在尝试将包含大量纹理 没有移动 的 openGL 编辑 我画的卡片 thx unwind 转换为一个 PNG 文件 我可以在框架的另一部分中使用该文件我正在与 有 C 库可以做到这一点吗 thanks 如果您的意思只是 获取由 Open
  • matplotlib 绘图,然后等待原始输入

    我正在尝试打开一系列 png 图 我希望能够在屏幕上查看绘图 然后收到提示 等待我 按 Enter 按回车键后 应显示下一个图 我见过很多类似的问题 Matplotlib 强制绘图显示然后返回主代码 https stackoverflow
  • 黑白 PNG 转 SVG

    我有一个河流 土地掩码来区分土地与河流 湖泊 该文件的大小为 W 43 200x H 21 600 由于 RAM 立即填满 因此无法打开该文件 我已将文件分成 3600 3600 块 它们可以正常打开 然而 我试图在谷歌地图中绘制陆地上的文
  • 使用 .NET 将两个 PNG 图像合并为一张图像

    我有两个 其实很多 PNG http en wikipedia org wiki Portable Network Graphics png 我的应用程序中的图像 两者都有透明区域 我想在我的应用程序中拍摄两个图像 将它们组合起来 并将结果
  • 图像/png 响应的原始响应

    我收到一个带有原始响应的响应主体 它应该代表一个 png 图像 我的问题是如何解码它并使其可渲染 PS 当我使用邮递员来测试这个时 我意识到邮递员可以渲染这个原始字符串 我想知道它是如何做到的 PNG IHDR X PPHYs o d ID
  • 使用 RenderTargetBitmap 的 WPF 画布区域的快照

    我想在我的应用程序中创建画布区域的快照 我使用 Visual Brush 来获取快照并使用 PngEncoder 保存相同的快照 但生成的 PNG 只是一个空的黑色图像 我不确定问题是与创建的 BitmapSource 还是 PNGEnco
  • matplotlib savefig 性能,在循环内保存多个 png

    我希望找到一种方法来优化以下情况 我有一个使用 matplotlib 的 imshow 创建的大型等高线图 然后 我想使用此等高线图来创建大量 png 图像 其中通过更改 x 和 y 限制以及长宽比 每个图像都是等高线图像的一小部分 因此
  • Python ImageTk.PhotoImage 使用 alpha 通道缓慢加载 png

    我编写了一个小程序来加载和显示图像 一切正常 直到我到达 示例中的 png 文件 shade png 显示这张小图片需要七七秒 PhotoImage 是否有错误或者我错过了一些 范围 这是我的示例代码 from PIL import Ima
  • MFC CImage alpha 混合出错

    我必须在图片控件上呈现由两个 PNG 文件组成的图像 其中顶部图像在某些位置具有透明像素 结果应该是plotter png 与 bar png 顶部重叠显示为 注意条上奇怪的白色轮廓 但应该是 我为它编写的代码很简单 CImage imag
  • Python 3.x 中的 PIL ImageTk 等效项

    我正在使用 Tkinter 开发一个应用程序 它使用以下数据库png图标的图像文件 为了在应用程序中使用所述图像 我使用 PIL 打开它们Image open 运行它通过ImageTk PhotoImage函数 然后将其传递给小部件构造函数
  • ggmap雄蕊水彩png错误

    我真的很感谢一些关于我在 ggmap 和雄蕊水彩方面遇到的问题的帮助 想法 每次我尝试创建雄蕊水彩图时 我都会收到相同的错误消息 Error in readPNG destfile file is not in PNG format 以下是
  • tesseract 处理后无法获取原始彩色位图 - android

    我使用 android 的 tesseract 库从图像中捕获某些文本 我知道捕获的图像不会保存在任何地方 它会被回收 我需要找到原始的彩色位图 我一直在尝试找到原始的彩色位图 但我所能找到的只是灰度位图 Bitmap bitmap act
  • 如何有效地将多个 rgl 图连接成一个图?

    我用以下命令制作了 3D 绘图rgl打包我的数据的每个因子级别并将它们保存为 png 我的数据有 30 个不同的级别 从而产生了 30 个不同的图像文件 现在我想将这些 png 合并成一个图 我会这样显示它们 下面的例子说明了我想做的事情
  • 通过 htaccess 将 PNG 解析为 PHP 仅适用于本地服务器,但不适用于网络服务器

    我用 PHP 创建了一个动态 PNG 图片 为了使用 PNG 扩展名 我创建了一个包含以下内容的 htaccess 文件 AddType application x httpd php png 在我的本地 XAMPP 服务器上 一切工作正常

随机推荐