كيفية ضم ملفين بتنسيق jpeg معًا بدون فقدان البيانات دون فك التشفير باستخدام محرر سداسي عشري؟

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

  •  03-07-2019
  •  | 
  •  

سؤال

أحاول كتابة برنامج (ربما في جافا) لضم عدد من ملفات jpegs معًا دون فقدان البيانات دون فك تشفيرها أولاً.

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

أولاً، أقوم باستخراج بيانات الصورة من ملف jpeg B وألحقها بملف jpeg A.من خلال تعديل الأبعاد المحددة في الترويسات، أحصل على صورة جديدة يمكن التعرف عليها (jpeg A + jpeg B ملحقة في المحور y) والتي يمكن عرضها.ومع ذلك، على الرغم من إمكانية التعرف بوضوح على بيانات الصورة من jpeg B، يبدو أنها فقدت الكثير من معلومات الألوان ومن الواضح أنها غير صحيحة.

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

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

شكرا جزيلا على اي مساعدة.


شكرا لجميع الاقتراحات.نعم هذا ممكن بالتأكيد، وكان ينبغي أن أذكر jpegtran في سؤالي الأصلي.أحاول بشكل أساسي تكرار هذا الجانب من وظيفة jpegtran ولكن استخدمه في برنامجي الخاص.أعتقد أنني يجب أن ألقي نظرة على مصدر jpegtran ولكني لا أعرف شيئًا عن لغة C ولا أعرف الكثير عن البرمجة بشكل عام، لذا فإن قول كود مصدر الهندسة العكسية أسهل من فعله!

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

المحلول 2

طيب أنا عملت بها حيث كنت تسير بشكل خاطئ.

1) يتم حفظ البيانات مسح الصورة في بايت، ولكن يتم ترميز المعلومات المهمة الفعلية كسلاسل بت متغير طول. وهذا يعني أن نهاية البيانات الصورة الفعلية لا تقع بالضرورة على حد بايت. عندما يحتاج التشفير الحياة السياسية في فرنسا لوحة من عدد البتات لجعل بايت الحدود يضيف ببساطة سلسلة من 1S.

2) الطريقة التي يتم تخزين المعلومات بكسل الفعلية قليلا معقدة جدا (على الأقل بالنسبة لي) إلى شرح، ولكن يتم ترميز كل شيء في الأساس داخل MCU، وحدة الترميز الحد الأدنى أو شيء من هذا. هذه تختلف في الحجم اعتمادا على الاختزال اللوني والأحجام الأفقي والرأسي يكون إما 8 أو 16 بكسل. لكل MCU، هناك DC AC والأجزاء التي تشكل عنصر واحد من الضياء، Y، أو التلون، وبناء القدرات والكروم. والمشكلة هي أن يتم تخزين مكونات DC كقيم فيما يتعلق قيمة DC ذات الصلة من MCU السابق. حتى عندما أضفت البيانات صورة جديدة من صور & B، فقد تخزين القيم DC في العلاقة إلى 0 (بسبب عدم وجود MCUs السابق)، لكنه بحاجة إلى أن تأخذ في الاعتبار القيم DC النهائية للMCU الماضي من JPG A. (أمله في أن من المنطقي).

والحل:

وتحتاج إلى القيام فك الأولي (هوفمان + runlength) من بيانات الصورة لمعرفة بالضبط حيث ينتهي بيانات الصورة ومن ثم تجريد 1S زائدة. تحتاج أيضا إلى تغيير القيم DC الأولية في JPG الثاني بشكل مناسب. ثم تحتاج إلى إعادة تشفير البتات المناسبة، إضافة 1S إلى تناسب إلى حد بايت، وآخرون فويلا.

إذا كنت تريد إلحاق في محور س، ه قليلا أكثر تعقيدا. لديك لإعادة ترتيب MCUs بحيث تفحص في حق النظام. JPGS مسح من اليسار إلى اليمين، ثم أعلى إلى أسفل ثم ضبط القيم DC بشكل مناسب.

وحتى الآن لقد اختبرت هذا فقط على JPGS MCU واحدة، ولكن من الناحية النظرية ينبغي لها أن تعمل مع أكبر منها أيضا.

وراجع للشغل عملت فقط من ذلك بفضل صاحب هذا ممتاز المتعلقة JPG الموارد / بلوق

نصائح أخرى

وهذا أمر قابل للتنفيذ إلى حد كبير.لقد فعلت ذلك على الكثير من مربعات صور خرائط Google للانضمام إليها وتكوين صورة بحجم الملصق.هناك حزمة لنظام Unix تسمى أدوات JPEG للقيام بذلك بالضبط.البرنامج يسمى com.jpegjoin.مصدر C النقي، مع ثنائيات ويندوز متاح.عند تجميعه، يقوم بإنشاء تطبيق سطر أوامر والذي عند تشغيله يجمع صورتين بتنسيق jpeg دون فقدان أي شيء من بين أشياء أخرى كثيرة.فهو لا يقوم بفك ضغط أي صورة، بل يقوم فقط بدمج البيانات المضغوطة معًا ويصلح الرأس وفقًا لذلك.لقد استخدمته لدمج 100 صورة لإنشاء 50 شريطًا ثم دمجت تلك الشرائط مرة أخرى لإنشاء صورة كبيرة.

يمكن العثور على مزيد من المعلومات في http://en.wikipedia.org/wiki/Lossy_compression#Lossless_editing

مصدر الرمز

كود المصدر للالأساسية jpegtran يمكن العثور على المكتبة هنا.مثال على البرنامج النصي للتقليد com.jpegjoin يكون هنا.

والحياة السياسية في فرنسا هو - مثل MP3 - مستقرة عادة عند إعادة ضغط عليه (باستخدام نفس خوارزمية)

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

ونهجين:

1) فك كلا مصدر الصور JPEG، دمج الصور النقطية الناتجة عنها، وترميز مرة أخرى كما JPEG. العيب هنا هو إعادة ضغط.

2) التأكد من أن عرض الصورة المصدر والارتفاع ومضاعفات 16، وربما عن طريق زراعة المحاصيل الصور. لا فك شفرة الصور ولكن بدلا من تجميع الهدف JPEG من الكتل مصدر MCU (حجم 16 × 16 pixles، وبالتالي فإن الاقتصاص).

وأنا أقترح عليك أن تنظر في DRI وعلامات RSTn، على الرغم من أن هذا يتطلب الكثير من الشروط المسبقة، لكنه يعمل بالنسبة لي: إلحاق PPM (شكل صورة نقطية) إلى الحياة السياسية في فرنسا التي يتم ترميز باستخدام DRI وRSTn، وكلاهما في نفس العرض، وكلاهما في مضاعفات MCU.

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

وبما أن فك التشفير والترميز الاشياء، أنا باستخدام libjpeg.

وبدلا من إلحاق الصور أفقيا، هو على الأرجح أسهل لتدوير كل صورة 90 درجة، ثم ينضم اليهم عموديا، ثم تدوير الصورة الناتجة الظهر -90 درجة.

وعمليات ضياع JPEG هي الى حد كبير الإرداف الخلفي. يمكنك القيام ببعض الخداع، مثل الدورية، ولكن هذا الى حد كبير ذلك.

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

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

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