2008-10-23 1 views
3

나는 오히려 고대 사진 개체 디스크를 발견하고 슬프게도 회사 (hemera)가 더 이상 지원하지 않는다는 것을 알게되었습니다. 이로 인해 나에게 전체 .hpi 파일 더미가 남았습니다. 다행히도 파일의 jpg 및 png 구성 요소를 추출 할 때 this information이 발견되었습니다..hpi 파일의 .jpg/.png 구성 요소를 추출하려면 어떻게해야합니까?

불행히도, 나는 그것을 작동시키지 못했습니다. 누구든지이 코드의 문제점을 파악할 수 있습니까? Perl이 당신의 일이 아니라면 PHP 나 Python 솔루션에 만족할 것입니다.

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 

답변

4

정규 표현식은 잘못된 것 같다 : 전혀 도움이된다면 :

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; }; 

내가 CD를 암초에 걸렸다 현재 테스트 파일의 16 진 덤프는 여기에있다.

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

#define MAX_SIZE 1048576 

char stuff[MAX_SIZE]; 

int main (int argc, char **argv) 
{ 
    unsigned int j_off, j_len, p_off, p_len; 
    FILE *fp, *jp, *pp; 
    fp = fopen (argv[1], "r"); 
    if (!fp) goto error; 
    if (fseek (fp, 12, SEEK_SET)) goto error; 
    if (!fread (&j_off, 4, 1, fp)) goto error; 
    if (!fread (&j_len, 4, 1, fp)) goto error; 
    if (!fread (&p_off, 4, 1, fp)) goto error; 
    if (!fread (&p_len, 4, 1, fp)) goto error; 
    fprintf (stderr, "INFO %s \t%d %d %d %d\n", 
     argv[1], j_off, j_len, p_off, p_len); 
    if (j_len > MAX_SIZE || p_len > MAX_SIZE) { 
     fprintf (stderr, "%s: Chunk size too big!\n", argv[1]); 
     return EXIT_FAILURE; 
    } 

    jp = fopen (argv[2], "w"); 
    if (!jp) goto error; 
    if (fseek (fp, j_off, SEEK_SET)) goto error; 
    if (!fread (stuff, j_len, 1, fp)) goto error; 
    if (!fwrite (stuff, j_len, 1, jp)) goto error; 
    fclose (jp); 

    pp = fopen (argv[3], "w"); 
    if (!pp) goto error; 
    if (fseek (fp, p_off, SEEK_SET)) goto error; 
    if (!fread (stuff, p_len, 1, fp)) goto error; 
    if (!fwrite (stuff, p_len, 1, pp)) goto error; 
    fclose (pp); 
    fclose (fp); 
    return EXIT_SUCCESS; 

error: 
    perror (argv[1]); 
    return EXIT_FAILURE; 
} 

그것은 input.hpi output.jpg output.png 명령 줄 매개 변수와 함께 작동 : 나는 나를 위해 그것을 할 수있는 작은 C 프로그램을 작성하는 이유입니다. 오류 처리가 100 % 정확하지는 않지만, 잘못된 것이 있거나 대부분 그것이 무엇인지 항상 알려주는 것이 좋습니다. 대용량 파일의 경우 MAX_SIZE를 확대해야합니다.

#!/bin/bash 

dest=<destination-folder> 

for arg in "[email protected]" 
do 
    base=`echo $arg | cut -d'.' -f1` 
    <executable> $arg $dest/original/$base.jpg $dest/mask/$base.png 2>>$dest/log 
    #composite -compose CopyOpacity $dest/mask/$base.png $dest/original/$base.jpg $dest/rgba/$base.png 
done 

옵션 복합 명령 (ImageMagick를 함께 제공)을 알파 채널로 적용 마스크를 가진 새 PNG 이미지를 만들 것입니다 : 여기

는 *의 .hpi으로 호출 할 수있는 쉘 스크립트입니다. 이 파일은 원본 파일보다 약 5 배 커야합니다.

일부 HPI 파일은 마스크없이 제공됩니다. 이 경우, 내 프로그램은 여전히 ​​작동하지만 빈 PNG 파일을 제공합니다.

+0

을 통해이 가능한 일부 데비안 시스템에서

위대한 작품! 나는 큰 위로 향하는 사람들이 나에게 위로 쳐다 보면서 50,000 개의 이미지로 2001 년으로 돌아갈 때까지 기다릴 수 없다. – Owen

+0

여분의 거리를 가야하는 와우 –

+0

나는 150,000 개가 넘는 이미지로 가득 찬 3 개의 데이터 DVD에 사용했습니다. – ypnos

5

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__ 
2

하지 프로그램 - 네 - 자신의 솔루션을하지만, 개인적인 용도로 프리웨어입니다 this 응용 프로그램은, 그것은 HPI 파일을 변환 할 수 있다고. 여기에 구글로 오시는 분들을 위해

+0

불행히도 나는 비 Windows 솔루션이 필요하다는 것을 알았습니다. – Owen

+0

몇 가지 윈도우 박스를 유지하는 이유 중 하나는 게임과 게임입니다. –

+1

나는'wine'을 사용하여 응용 프로그램을 실행하려고합니다. – tzot

2

, 나는 단지 PNG 이미지에 대해이 문제를 해결하는 파이썬 스크립트를 작성했습니다 : .jpeg를 들어

#!/usr/bin/python 
# -*- coding: utf-8 -*- 
import re, sys 

def main(): 
    if len(sys.argv) < 2: 
    print """Usage: 
    {0} BINARY_FILE PNG_PATH_TEMPLATE 
Example: 
    {0} bin/program 'imgs/image.{{0:03d}}.png'""".format(__file__) 
    return 
    binfile, pngpath_tpl = sys.argv[1:3] 

    rx = re.compile("\x89PNG.+?IEND\xAEB`\x82", re.S) 
    bintext = open(binfile, "rb").read() 
    PNGs = rx.findall(bintext) 

    for i, PNG in enumerate(PNGs): 
    f = open(pngpath_tpl.format(i), "wb") # Simple string format. 
    f.write(PNG) 
    f.close() 

if __name__ == "__main__": 
    main() 
0

recoverjpeg.mov 파일, 나는 리눅스 테스트 (하지만 다른 플랫폼과 호환 될 수 있음). apt get install recoverjpeg

관련 문제