我偶然发现了相当古老的照片对象磁盘,遗憾地发现公司(hemera)不再提供支持了.这给我留下了一大堆.hpi文件.幸运的是,我发现这个信息对提取的文件JPG和PNG组件.
不幸的是,我无法让它发挥作用.谁能弄清楚这段代码有什么问题?如果Perl不是您的话,我会对PHP或Python解决方案感到满意.:)
open(I, "$name") || die;
binmode(I);
$_ = <I>;
close(I);
my ($j, $p) = m|^.{32}(.*)(\211PNG.*)$|s;
open(J, ">$name.jpg") &&
do { binmode(J); print J $j; close J; };
open(P, ">$name.png") &&
do { binmode(P); print P $p; close P; };
Run Code Online (Sandbox Code Playgroud)
如果它有帮助的话,我从CD中取出的当前测试文件的hexdump就在这里:
0000000 89 48 50 49 0d 0a 1a 0a 64 00 00 00 20 00 00 00
0000010 45 89 00 00 65 89 00 00 0a 21 00 00 00 d0 d0 00
Run Code Online (Sandbox Code Playgroud)
我有一个类似的问题从MS Word文档中提取图像.这是我为此写的程序.它只提取PNG,但是:
#!/usr/bin/perl
use strict;
my $HEADER = "\211PNG";
my $FOOTER = "IEND\xAEB`\x82";
foreach my $file ( @ARGV )
{
print "Extracting $file\n";
(my $image_base = $file) =~ s/(.*)\..*/$1/;
my $data = do { local $/; open my( $fh ), $file; <$fh> };
my $count = 0;
while( $data =~ m/($HEADER.*?$FOOTER)/sg )
{
my $image = $1;
$count++;
my $image_name = "$image_base.$count.png";
open my $fh, "> $image_name" or warn "$image_name: $!", next;
print "Writing $image_name: ", length($image), " bytes\n";
print $fh $image;
close $fh;
}
}
__END__
Run Code Online (Sandbox Code Playgroud)