كيف يمكنني استخراج .jpg/.png مكونات .hpi الملف ؟

StackOverflow https://stackoverflow.com/questions/228165

  •  03-07-2019
  •  | 
  •  

سؤال

أنا تعثرت عبر بلدي بدلا من الصورة القديمة الكائنات الأقراص, و للأسف اكتشفت الشركة (hemera) لا توفر الدعم لذلك بعد الآن.وقد ترك لي مع كومة كاملة من .hpi الملفات.لحسن الحظ وجدت هذه المعلومات على استخراج jpg و png مكونات الملف.

للأسف لم أتمكن من الحصول على عمل.يمكن لأي شخص معرفة ما هو الخطأ في هذا الكود ؟ سأكون سعيدا مع 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; };

على 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
هل كانت مفيدة؟

المحلول

يبدو regexp هو الخطأ.هذا هو السبب في أنني كتبت القليل برنامج C أن تفعل ذلك بالنسبة لي:

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

يعمل مع معلمات سطر الأوامر الإدخال.hpi output.jpg الإخراج.بابوا غينيا الجديدة.على معالجة الأخطاء ليست 100% صحيحة, ولكن جيدة بما فيه الكفاية دائما أقول لكم إذا كان هناك شيء خاطئ في معظم الأحيان ما هو عليه. بالنسبة للملفات الكبيرة ، سيكون لديك تكبير COUNT.

هنا هو قذيفة النصي الذي يمكنك أن تتصل مع *.hpi:

#!/bin/bash

dest=<destination-folder>

for arg in "$@"
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

الاختياري مركب القيادة (يأتي مع يماغيماغيك) خلق جديد PNG الصورة التي القناع يطبق قناة ألفا.علما أن هذا الملف سيكون حوالي 5 مرات أكبر من الملفات الأصلية.

علما أن بعض HPI الملفات تأتي من دون قناع.في هذه الحالة, البرنامج سوف لا تزال تعمل ، ولكن تعطي فارغة ملف PNG.

نصائح أخرى

وكان لي مشكلة مماثلة استخراج الصور من وثيقة مايكروسوفت وورد. وهنا البرنامج كتبت لذلك. انها مقتطفات فقط ملفات 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__

وليس حل البرنامج الإلكتروني الخاص، ولكن هذا التطبيق ، وهو مجانية للاستخدام الشخصي، ويذكر أنه يمكن تحويل ملفات الفقر البشري.

وبالنسبة لأولئك الذين يصلون عن طريق جوجل هنا، قمت بكتابة السيناريو بيثون أن يحل هذه المشكلة للصور PNG فقط:

#!/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()

ل.jpeg و.mov الملفات هناك recoverjpeg ، التي اختبرت على لينكس (ولكن قد تكون متوافقة مع منصات أخرى).

في بعض النظم ديبيان لأنها متاحة من خلال apt get install recoverjpeg

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top