我有一些代码应该使用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");
但代码在write函数失败时出现:
libpng错误:调用NULL写入函数
有关如何解决此问题的任何提示?文件存在且进程也具有写访问权。
My Perl版本(最新的Strawberry Perl):
这是为perl 5,版本26,颠覆0(v5.26.0)而构建的 MSWin32 86多线程64int
libpng模块的版本:
cpan -D Image :: 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
答案 0 :(得分:1)
该模块的作者向我指出了以下函数文档: https://metacpan.org/pod/Image::PNG::Libpng#write_png_file 那说:
$ png必须是“create_write_struct”创建的对象,所以 “read_png_file”后跟对此的调用不起作用。
$png->copy_png
可用于创建write
能力结构。
因此,在调用$lpng = $lpng->copy_png();
之前插入set_text
会导致预期的行为。
完整(和清理)代码供参考:
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");