كيف أكتب برنامج Perl النصي لتصفية الصور الرقمية التي تم التلاعب بها؟

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

  •  06-07-2019
  •  | 
  •  

سؤال

الليلة الماضية قبل الذهاب إلى السرير، قمت بتصفح قسم Scalar Data في Learning Perl مرة أخرى وعثرت على الجملة التالية:

القدرة على وجود أي حرف في سلسلة تعني أنه يمكنك إنشاء البيانات الثنائية الأولية ومسحها ضوئيًا ومعالجتها كسلاسل.

طرأت على ذهني على الفور فكرة مفادها أنه يمكنني بالفعل السماح لـ Perl بمسح الصور التي قمت بتخزينها على القرص الصلب الخاص بي للتحقق مما إذا كانت تحتوي على سلسلة Adobe.يبدو أنه من خلال القيام بذلك، يمكنني معرفة أي منهم تم تعديله بالفوتوشوب.لذلك حاولت تنفيذ الفكرة وتوصلت إلى الكود التالي:

#!perl
use autodie;
use strict;
use warnings;

{
    local $/="\n\n";
    my $dir = 'f:/TestPix/';
    my @pix = glob "$dir/*";

    foreach my $file (@pix) {
        open  my $pic,'<',  "$file";

        while(<$pic>) {
            if (/Adobe/) {
                print "$file\n";
            }
        }
    }
}

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

if (!= /the origianl format/) {...}

أم أنه يتعين علينا ببساطة إضافة المزيد من الشروط؟يحب

if (/Adobe/|/ACDSee/|/some other picture editors/)

أي أفكار حول هذا؟أم أنني أفرط في التبسيط بسبب معرفتي المحدودة بالبرمجة؟

شكرا، كما هو الحال دائما، على أي توجيه.

هل كانت مفيدة؟

المحلول

وأفضل رهان في بيرل هو على الارجح ExifTool . هذا يتيح لك الوصول إلى أي معلومات صورة غير مضمن في الصورة. ومع ذلك، كما قال أشخاص آخرين، فمن الممكن لتجريد هذه المعلومات بها، بطبيعة الحال.

نصائح أخرى

وأنا لا أريد أن أقول ليست هناك أي وسيلة للكشف عن تغيرات في صورة، ولكن المشكلة هي في غاية الصعوبة.

والشخص الوحيد الذي أعرفه من يدعي أن يكون جوابا هو الدكتور نيل Krawetz ، الذي يدعي أن أجزاء التلاعب فيها من الصورة سيكون مختلفة معدلات الخطأ ضغط من الأجزاء الأصلية. ويدعي أن إعادة إنقاذ واحد JPEG في مستويات جودة مختلفة وتسليط الضوء على هذه الاختلافات.

ولم أجد أن تكون هذه هي الحالة، في التحقيقات بلدي، ولكن ربما قد يكون لديك نتائج أفضل.

ولا. ليس هناك أي تمييز وظيفي بين الصورة تماما تحريرها، واحد الذي كان على ما هو عليه منذ البداية - الأمر كله مجرد كيس من بكسل في النهاية، بعد كل شيء، وأية بيانات تعريف الآخر الذي يمكن أن يزيل أو صياغة كل ما تريد.

إن اسم برنامج الرسومات المستخدم لتحرير الصورة ليس جزءًا من بيانات الصورة نفسها ولكنه جزء من شيء يسمى البيانات الوصفية - والتي يمكن يتم تخزينها في ملف الصورة، ولكن، كما لاحظ آخرون، ليست مطلوبة (لذلك قد لا تقوم بعض البرامج بتخزينها، والبعض الآخر قد يسمح لك بخيار عدم تخزينها) ولا يمكن الاعتماد عليها - إذا قمت بتزوير صورة، فربما تكون قد قمت بتزويرها البيانات التعريفية أيضًا.

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

إذا كنت تميل إلى معرفة المزيد حول معالجة الصور في لغة Perl، فيمكنك إلقاء نظرة على بعض الوحدات الممتازة التي تقدمها CPAN:

  • الصورة::ماجيك - قراءة ومعالجة وكتابة عدد كبير من تنسيقات ملفات الصور
  • جي دي - إنشاء رسومات ملونة باستخدام عدد كبير من الرسومات الأولية، وإصدار الرسومات بتنسيقات مختلفة.
  • جي دي::رسم بياني - إنشاء الرسوم البيانية
  • جي دي::Graph3d - إنشاء رسوم بيانية ثلاثية الأبعاد باستخدام GD وGD::Graph

ومع ذلك، هناك أدوات مساعدة أخرى متاحة لتحديد تنسيقات الصور المختلفة.إنه أكثر من سؤال ل المستخدم الفائق, ، ولكن يمكنك استخدامها لتوزيعات يونكس المختلفة file لتحديد العديد من أنواع الملفات المختلفة، وبالنسبة لنظام التشغيل MacOSX، محول الرسومات لم يخذلني أبدا.(حتى أنها كانت قادرة على فتح الأشعة السينية الغريبة متعددة الملفات لحوض قطتي المكسور الذي حصلت عليه على قرص من الطبيب البيطري.)

وكيف تعرف ما هو الشكل الأصلي؟ أنا متأكد ليس هناك طريقة مضمونة لمعرفة ما إذا تم تعديل صورة.

وأستطيع أن مجرد فتح ملف (مع المفضلة API لغة البرمجة والملفات) واكتبوا كل ما أريد في هذا الملف طوعا أو كرها. طالما أنا لا المسمار شيء ما مع تنسيق الملف، وكنت لا تعرف أبدا ما حدث.

وهيك، وأنا يمكن طباعة الصورة من ثم مسح مرة أخرى في. كيف كنت أقول ذلك من أصل؟

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

وهناك دائما خيار تشغيل بعض معقدة للغاية خوارزمية التعرف على الصور التي من شأنها أن تحليل كل بكسل في الصورة والقيام ببعض الاشياء معقدة للغاية لتحديد ما إذا كان التلاعب الصورة أم لا. وهذا الحل ربما تنطوي AI التي ستدرس ملايين الصور التي يتم التلاعب حد سواء، وتلك التي ليست والتعلم منها. ومع ذلك، وهذا هو أكثر من حل نظري وليس عملي جدا ... ربما كنت ترى إلا في الأفلام. وسيكون من المعقد للغاية لتطوير وربما يستغرق سنوات. وحتى لو كنت لم تحصل على شيء مثل هذا العمل، فإنه ربما لا يزال لن تكون صحيحة 100٪ في كل وقت. انا التخمين التكنولوجيا AI لا يزال غير على هذا المستوى، ويمكن أن يستغرق بعض الوقت حتى يصبح.

وهناك سمة معروفة يست عادة من exiftool يسمح لك التعرف على البرامج التي تنشأ من خلال تحليل الجداول تكميم JPEG (لا تعتمد على الصورة الوصفية). ويعترف الجداول مكتوبة من قبل العديد من التطبيقات. لاحظ أن بعض الكاميرات قد تستخدم الجداول تكميم نفس بعض التطبيقات، لذلك هذا ليس حلا بنسبة 100٪، ولكن الأمر يستحق النظر في. هنا مثال على exiftool تعمل على صورتين، تم تحرير أول مرة من قبل فوتوشوب.

> exiftool -jpegdigest a.jpg b.jpg
======== a.jpg
JPEG Digest                     : Adobe Photoshop, Quality 10
======== b.jpg
JPEG Digest                     : Canon EOS 30D/40D/50D/300D, Normal
    2 image files read

وهذا ستعمل حتى إذا تمت إزالة البيانات الوصفية.

وهناك برامج الموجودة هناك والتي تستخدم تقنيات مختلفة (ارتيفاستينغ ضغط، بالمقارنة مع التشكيلات التوقيع في قاعدة البيانات من الكاميرات، الخ) لتحليل البيانات الصورة الفعلية عن أدلة على التغيير. إذا كان لديك الوصول إلى مثل هذه البرامج والبرمجيات المتاحة لك يوفر API للوصول الخارجي لهذه الوظائف التحليل، ثم هناك فرصة لائق أن وحدة بيرل موجودة والتي سوف التفاعل مع هذا API، وإذا لم توجد مثل هذه الوحدة، ما في وسعها ربما أن تنشأ بسرعة إلى حد ما.

في نظرية، فإنه أيضا يكون من الممكن تنفيذ التعليمات البرمجية تحليل الصور مباشرة في بيرل الأصلي، لكنني لست على علم أي شخص بعد أن فعلت ذلك، وأتوقع أن كنت أفضل حالا كتابة شيء ما على مستوى منخفض و المعالج مكثفة في لغة مترجمة بالكامل (على سبيل المثال، C / C ++) وليس في بيرل.

http://www.impulseadventure.com/photo/jpeg-snoop.html هو الأداة التي لا وظيفة جيدة تقريبا

إذا لم يكن هناك أي الاستنساخ، وهناك اختلاف في تركيز density..or بكسل مما يدل تصل أحيانا .. على التفتيش اليدوي ومنطقة المستنسخة فوتوشوب حتى يكون كثافة بكسل (معنى بلدي هو الاختلاف من بكسل WRT صورة ممسوحة ضوئيا)

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