【问题标题】:Image::PNG::Libpng: "libpng error: Call to NULL write function"Image::PNG::Libpng: "libpng 错误:调用 NULL 写入函数"
【发布时间】:2017-11-17 21:39:01
【问题描述】:

我有一些代码应该使用 libpng 的 Perl 绑定来修改 PNG 文件的 tEXt 或 zTXt 块。

代码:

use strict;
use warnings;
use Data::Dumper qw(Dumper);
use Image::PNG::Libpng qw(read_png_file write_png_file) ;


my $lpng = read_png_file ("testimg.png");

my @cmdAr = ();
for(my $i=0; $i<10; ++$i){
  push(@cmdAr, {compression => Image::PNG::Libpng::PNG_TEXT_COMPRESSION_zTXt ,
                key => sprintf("par_%02i",$i),
                text => sprintf("%06i", $i*$i)
               }
      );
}
print STDERR Dumper(\@cmdAr);
$lpng->set_text (\@cmdAr);
$lpng->write_png_file ("testimg2.png");

但代码在写入函数时失败:

libpng 错误:调用 NULL 写入函数

关于如何解决这个问题的任何提示?文件存在,进程也有写权限。

我的 Perl 版本(最新的草莓 Perl):

这是 perl 5, version 26, subversion 0 (v5.26.0) MSWin32-x86-multi-thread-64int

libpng 模块的版本:

cpan -D 图像::PNG::Libpng

CPAN: CPAN::SQLite loaded ok (v0.211)
Database was generated on Thu, 15 Jun 2017 10:43:51 GMT

Image::PNG::Libpng
-------------------------------------------------------------------------
    CPAN: Module::CoreList loaded ok (v5.20170530)
(no description)
    B/BK/BKB/Image-PNG-Libpng-0.43.tar.gz
    C:\strawberry-perl\perl\site\lib\Image\PNG\Libpng.pm
    Installed: 0.43
    CPAN:      0.43  up to date
    Ben Bullock (BKB)
    bkb@cpan.org

【问题讨论】:

  • 你有正确版本的 libpng 吗?
  • @simbabque 我有一个与 cpan-package 一起安装的
  • @simbabque png-chunks 被命名为 tEXtzTXt 所以在编辑之前它是正确的
  • 哦,对不起。大写字母错别字较多,所以我认为也只是一个错别字。

标签: perl libpng


【解决方案1】:

该模块的作者向我指出了以下函数文档: https://metacpan.org/pod/Image::PNG::Libpng#write_png_file 上面写着:

$png 必须是“create_write_struct”创建的对象,所以 "read_png_file" 之后调用 this 不起作用。

$png-&gt;copy_png 可用于创建write-able 结构。

因此,在调用 set_text 之前插入 $lpng = $lpng-&gt;copy_png(); 会导致预期的行为。

完整(和清理过的)代码供参考:

use strict;
use warnings;
use Image::PNG::Libpng qw(read_png_file write_png_file) ;



my @txts = ({compression => Image::PNG::Libpng::PNG_TEXT_COMPRESSION_zTXt,
             key          => "myImportentTextData",
             text         => "fooBar"
            });

my $png = read_png_file ("testimg.png");

$png = $png->copy_png();  #< this is important!

$png->set_text (\@txts);
$png->write_png_file ("testimg2.png");

【讨论】:

    猜你喜欢
    • 2012-08-17
    • 2016-02-24
    • 2014-03-30
    • 2012-05-13
    • 2014-11-15
    • 1970-01-01
    • 2011-08-11
    • 1970-01-01
    • 2016-08-15
    相关资源
    最近更新 更多