লেপটন সংকোচনের চেষ্টা করুন


17

ড্রপবক্স সম্প্রতি মুক্তি পেয়েছে লেপটন ( গিটহাব ), এমন একটি পদ্ধতি যা নিখরচায় জেপিইজি চিত্রগুলি রাউন্ড- ট্রিপতে সংকুচিত করে, গড়ে 22% সাশ্রয় করে।

কবুতরহোল নীতিটির কারণে , কোনও সাধারণ সংক্ষেপণ অ্যালগরিদমের কোনও ছোট ফাইলের ফলস্বরূপ গ্যারান্টি দেওয়া যায় না ( সাধারণ কারণ এটি নির্দিষ্ট বিন্যাসে আবদ্ধ ইনপুটগুলির ক্ষেত্রে প্রযোজ্য নয়)। লেপটন জেপিইজি সম্পর্কে সাধারণ বৈশিষ্ট্যগুলি ব্যবহার করে, যদি এটি রূপান্তরিত হয় তবে উত্সের চেয়ে বড় কোনও ফাইল তৈরি করার জন্য এটি কবুতরহোল করতে পারে।

আবশ্যকতা

একটি প্রোগ্রাম লিখুন যা উত্পন্ন করে:

  • একটি বৈধ জেপিইজি / জেএফআইএফ চিত্র,
  • 0.5 এমবি এবং 1 এমবি এর মধ্যে একটি আকার সহ,
  • 256 × 256 px এর চেয়ে ছোট নয়,
  • 4096 × 4096 px এর চেয়ে বড় নয়,
  • লেপটন দ্বারা সনাক্তযোগ্য (এটি সফলভাবে কোনও .lepচিত্রকে "সংকুচিত করতে পারে" ) এবং
  • একটি অভিন্ন .jpg হিসাবে ইনপুট (ইনপুট হিসাবে)।
  • APPx, COMএবং অন্যান্য মেটাডেটা, নন-গ্রাফিকাল মার্কার বিভাগগুলি জেপিজিতে সীমাবদ্ধ রয়েছে (ইমেজটিতে এলোমেলো পরিমাণে এলোমেলো বাইট ইনজেকশন হিসাবে সংক্ষিপ্ত আকারে 1: 1 সংক্ষেপণ লম্বা হয়))
    • একটি APP0জেএফআইএফ চিহ্নিতকারীকে অনুমোদিত তবে কোনও থাম্বনেইল অনুমোদিত নয় (ঠিক 16 বাইট হওয়া উচিত)
    • tl; dr আপনি যদি ইচ্ছাকৃতভাবে কোনও এক্সআইএফ বিভাগে মেটাডেটা নাড়িয়ে চলেছেন এবং আপনার পছন্দের ভাষা লাইব্রেরি চিত্রটিতে রাখতে চান তবে তা ঠিক হওয়া উচিত।

কোড এবং চিত্র পোস্ট করুন।

আপনি যদি এমন কোনও প্রোগ্রাম লিখতে চান যা একটি লেপটনের চিত্র তৈরি করে যা রূপান্তরিত হয় যখন কোনও জেপিইজি মানদণ্ডের সাথে মিল করে , এটি ঠিক আছে। এটি নির্বিচারে অনেক JPEG → Lepton → JPEG → ... চক্র জুড়ে অভিন্ন থাকতে হবে।

স্কোরিং

উত্স জেপিইজি চিত্র দ্বারা বিভক্ত লেপটন চিত্রের বাইট আকার। উচ্চতর (খারাপ লেপটন সংকোচন) ভাল। ডিফল্ট পতাকা এবং সুইচ দিয়ে লেপটন চালান Run


লেপটন পাচ্ছি

লেপটন তৈরির জন্য একটি 5-সেকেন্ডের ক্রাশ-কোর্স:

git clone https://github.com/dropbox/lepton.git
cd lepton
./autogen.sh && ./configure && make

# fish shell: ./autogen.sh ;and ./configure ;and make

তারপরে ./lepton --helpআপনাকে কিছু বলা উচিত।


আমি মনে করি এটি এমন একটি কোড গল্ফ চ্যালেঞ্জে আবার চালু করা যেতে পারে যেখানে আপনি এমন কোড লেখেন যা এমন চিত্র তৈরি করে যা কমপক্ষে কিছু ধ্রুবক দ্বারা সংকোচনে ব্যর্থ হয়। আসলে, জেপিগকে হার্ডকোড করার চেয়ে আকারের চেয়ে অনেক ছোট কোডের আকারের উপরের বাউন্ডটি লাগানো যথেষ্ট, তবে যুক্তিসঙ্গত প্রোগ্রামের পক্ষে যথেষ্ট বড়।
xnor

3
অভিন্ন র্যান্ডম পিক্সেল সেরা উত্তর নয় এমনটি আশা করার কোনও কারণ আছে কি?
ফেয়ারস

@ ফেয়ারসাম আপনি কি আমার উদাহরণের মতো বোঝাতে চাইছেন?
নিক টি

1
এছাড়াও, যেহেতু জেপিগি একটি ক্ষতিকারক ফর্ম্যাট, তাই প্রদত্ত চিত্রটিকে সংকুচিত করার জন্য অনেকগুলি উপায় (যেমন "অন্যান্য জিনিসের মধ্যে" মানের ") রয়েছে। প্রতিটি জেপিজি ফাইলে একটি দুটি টেবিল থাকে যা বাকী চিত্রটি কীভাবে ডিকোড করা হয় তা নির্দেশ করে এবং সেই টেবিলগুলি মূলত যা কিছু হতে পারে। আপনি যদি বিভিন্ন প্রোগ্রামে একটি বিএমপি চিত্র সংরক্ষণ করেন তবে এটি সম্ভবত অভিন্ন হবে। আপনি যদি কোনও জেপিজি বিভিন্ন প্রোগ্রামে সংরক্ষণ করেন, যদি না তারা একই ব্যাক-এন্ড লাইব্রেরি ব্যবহার করে, সম্ভবত না।
নিক টি

2
@ ফেয়ারসাম একটি জেপিজি কমপ্রেসরে অভিন্নভাবে এলোমেলো ইনপুট ফলে অভিন্ন আউটপুট তৈরি হয় না এবং লেপটন যা কাজ করে তা আউটপুট। যদি আপনি এমন একটি ইনপুট নিয়ে আসতে পারেন যা একটি জেপিইজি সংক্ষেপককে অভিন্ন র্যান্ডম আউটপুট উত্পাদন করে, তবে সম্ভবত এটি এখানে এবং অন্য কোথাও কার্যকর হবে।
স্পার

উত্তর:


4

পাইথন 3 + মোজ্জেপেগ + / দেব / ইউরানডম, 720 × 720: গড়। স্কোর ১০২%

mozjpegপ্যাকেজের উপর নির্ভর করে , কোডটি এটি ইনস্টল করা আছে বলে ধরে নেয় /usr/local/opt/mozjpeg। (ওএস এক্সে এটি ইনস্টল করা তুচ্ছ, কেবল চালানো brew install mozjpeg)

এছাড়াও এটি /dev/urandomবিশেষ ফাইলের উপর নির্ভর করে , এটি এলোমেলো ডেটা তৈরির জন্য ব্যবহৃত হয়।

কোডটি কেবল mozjpegসংক্ষেপককে র্যান্ডম ডেটা ফিড করে (টিজিএ ফর্ম্যাটে, কারণ সিজেপেইগ এটি বুঝতে পারে এবং এটির খুব সহজ শিরোনাম রয়েছে), এবং এটি একটি অনুকূলিত জেপিইগ ফাইল তৈরি করতে দেয়। গুণমানটি সর্বাধিকতে সেট করা হয়েছে কারণ এটি ডিজিটি সহগকে কমপক্ষে সংকোচনযোগ্য করে তোলে এবং সংকোচনযোগ্য ডেটা সংকোচন করতে কোন অ্যালগরিদম ব্যবহার করা হয় তাতে কিছু আসে যায় না।

আমি পরীক্ষা করে দেখেছি যে jpeg-> লেপটন-> জেপিগ চক্রটি ক্ষতিহীন - এটি সত্য।

import subprocess
from subprocess import PIPE

c_mozjpeg_path = '/usr/local/opt/mozjpeg/bin/cjpeg'
cjpeg_params = '-quality 100 -dc-scan-opt 2 -dct float -targa'
image_size = 720


def write_random_tga_image(w, h, of, rf):
    def wb(value, size):
        of.write(int.to_bytes(value, size, 'little'))

    wb(0, 2)
    wb(3, 1)
    wb(0, 9)
    wb(w, 2)
    wb(h, 2)
    wb(8, 1)
    wb(0, 1)

    data_size = w * h
    while data_size > 0:
        data_size -= of.write(rf.read(data_size))


def main():
    with open('/dev/urandom', 'rb') as rf:
        with open('oops.jpg', 'wb') as f:
            p = subprocess.Popen((c_mozjpeg_path,) + tuple(cjpeg_params.split(' ')), stdin=PIPE, stdout=f)
            write_random_tga_image(image_size, image_size, p.stdin, rf)
            p.communicate()


if __name__ == '__main__':
    main()

কোড গল্ফ করা হয় না, সম্ভবত।

উদাহরণ চিত্র:

মজাদার ঘটনা: উত্পন্ন জেপিইজি ফাইল উত্স সঙ্কুচিত টিজিএ চিত্রের চেয়ে বড়, যদিও জেপিইজি ক্ষতিকারক সংকোচনের ব্যবহার করে।

মজাদার ঘটনা 2: ইমগুর (এসও এর জন্য ডিফল্ট চিত্র হোস্টিং) এই ফাইলটিতে খুব খারাপ কাজ করে - কোনও কারণে এটি 1MB এর চেয়ে কম হলেও এটি নিম্ন মানের প্রতিরোধ করে। সুতরাং আমি উদাহরণ চিত্রটি আপলোড করতে গিথুবকে ব্যবহার করেছি।

মজাদার ঘটনা 3: সাধারণভাবে মোজপেইগ বিদ্যমান জেপিইজি ডিকোডারগুলির সাথে সামঞ্জস্যপূর্ণ থাকাকালীন আরও ভাল জেপিইজি সংক্ষেপণ করে। এবং এটি losslessly, কোন JPEG ফাইল নিখুত খুব করার টুল আছে - jpegtran


আমি ক্রস প্ল্যাটফর্ম আরএনজি (উদাহরণস্বরূপ সিস্টেমর্যান্ডম ক্লাস) ব্যবহার করতে পারি তবে আমি খুব অলস ছিলাম। এটি তুচ্ছ এবং এটি একইরকম ফলাফল দেয়।
প্রদর্শন করুন

1

নিষ্পাপ নয়েস, 1024 × 1024: স্কোর 85.55%

বল রোলিংয়ের জন্য পাইথনের একটি অনুগত উদাহরণ। কোনওভাবেই অনুকূলিত হয়নি; সম্ভাব্য ত্রুটিগুলি:

  • ডিফল্ট মানের সেটিংস কী তা কোনও ধারণা নেই।
  • প্রতিটি 8x8 ব্লকের কার্যতই এটির সংলগ্নের সাথে একই গড় মান (~ 50%) রয়েছে: লেপটন বলেছেন যে তারা সেই তথ্যটি স্থান বাঁচাতে ব্যবহার করে।
  • সম্পূর্ণরূপে ডিফল্ট কোয়ান্টাইজেশন এবং হাফম্যান টেবিলগুলি (গ্রন্থাগারটি যা ব্যবহারের সিদ্ধান্ত নেয়)।

import numpy as np
from PIL import Image

np.random.seed(0) # make sure it's repeatable.

size = 1024

imgr = np.random.randint(0, 0xFF, (size, size, 3)).astype('uint8')
pimg = Image.fromarray(imgr)
pimg.save('noise.jpg')

গোলমাল

তারপরে কিছু কাজ করার জন্য বাশ:

./lepton noise.jpg noise.lep 2>\dev\null # vomits out a lot of technobabble
./lepton noise.lep noise-out.jpg 2>\dev\null

diff -qs noise.jpg noise-out.jpg

SIZE1=$(stat -f "%z" noise.jpg) # http://superuser.com/a/570920/18931
SIZE2=$(stat -f "%z" noise.lep)
RATIO=$(bc <<< "scale=4; $SIZE2/$SIZE1")
echo "$SIZE2/$SIZE1 = $RATIO"

# Files noise.jpg and noise-out.jpg are identical
# 538817/629769 = .8555
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.