| JPEGTRAN(1) | General Commands Manual | JPEGTRAN(1) |
نام (NAME)
jpegtran - تبدیل و تحول بدون افتِ کیفیتِ فایلهای JPEG
خلاصه دستور (SYNOPSIS)
jpegtran [ options ] [ filename ]
توضیحات (DESCRIPTION)
دستور jpegtran تبدیلهای کاربردی گوناگونی را روی فایلهای بااتلاف (مبتنی بر DCT) JPEG انجام میدهد. این ابزار میتواند نمایش کدگذاریشده را از یک گونهٔ JPEG به گونهای دیگر تبدیل کند، برای نمونه از JPEG مبنا (baseline) به JPEG تدریجی (progressive) یا برعکس. همچنین میتواند تغییراتی در چیدمان دادههای تصویر اعمال کند، مانند چرخاندن یک تصویر از حالت افقی به عمودی.
برای فایلهای EXIF و فایلهای JPEG دارای دادههای Exif، شاید ترجیح دهید به جای آن از exiftran استفاده کنید.
روش کار jpegtran بر پایهٔ بازآرایی دادههای فشردهشده (ضرایب DCT)، بدون رمزگشایی کامل تصویر است. بنابراین، تبدیلات آن بدون افت (lossless) هستند: هیچگونه کاهش کیفیتی در تصویر رخ نمیدهد؛ چیزی که اگر از djpeg و سپس cjpeg برای انجام همان تبدیل استفاده میکردید رخ میداد. اما به همین دلیل، jpegtran نمیتواند عملیات بااتلاف (lossy) مانند تغییر کیفیت تصویر را انجام دهد. با این حال، اگرچه دادههای تصویری بدون افت تبدیل میشوند، فرادادهها میتوانند حذف شوند. برای جزئیات، گزینهٔ -copy را ببینید.
ابزار jpegtran فایل JPEG/JFIF مشخصشده، یا در صورت مشخص نشدن نام فایل، ورودی استاندارد را میخواند و یک فایل JPEG/JFIF در خروجی استاندارد تولید میکند.
گزینهها (OPTIONS)
نام تمامی گزینهها (سوییچها) را میتوان به صورت کوتاه نوشت؛ برای نمونه، -optimize میتواند به صورت -opt یا -o نوشته شود. حروف بزرگ و کوچک معادل یکدیگرند. املاهای بریتانیایی نیز پذیرفته میشوند (مانند -optimise)، اگرچه برای اختصار در ادامه به آنها اشاره نشده است.
برای مشخص کردن نحوهٔ کدگذاری JPEG در فایل خروجی، jpegtran زیرمجموعهای از گزینههای پذیرفتهشده توسط cjpeg را میپذیرد:
- -optimize
- بهینهسازی پارامترهای کدگذاری آنتروپی را انجام میدهد.
- -progressive
- یک فایل JPEG تدریجی (progressive) ایجاد میکند.
- -arithmetic
- استفاده از کدگذاری حسابی (arithmetic coding).
- -restart N
- درج یک نشانگر شروع مجدد (restart marker) در هر N سطرِ MCU، یا هر N واحدِ MCU در صورتی که حرف "B" به عدد پیوست شده باشد.
- -scans file
- استفاده از اسکریپت پویش (scan script) ارائهشده در فایل متنی مشخصشده.
برای جزئیات بیشتر دربارهٔ این گزینهها cjpeg(1) را ببینید. اگر هیچکدام از این گزینهها را مشخص نکنید، یک فایل خروجی استاندارد baseline-JPEG تولید خواهد شد. تنظیمات کیفیت و موارد مشابه از فایل ورودی تعیین میشوند.
تصویر را میتوان بدون افت کیفیت با مشخص کردن یکی از این گزینهها دگرگون کرد:
- -flip horizontal
- آینهای کردن افقی تصویر (چپ به راست).
- -flip vertical
- آینهای کردن عمودی تصویر (بالا به پایین).
- -roll +X+Y
- لغزاندن چرخشی تصویر (جابهجایی دورانی) به اندازهٔ X پیکسل به صورت افقی و Y پیکسل به صورت عمودی. X و Y میتوانند منفی باشند؛ X منفی تصویر را به چپ و Y منفی تصویر را به بالا جابهجا میکند. اگر مبدأ منتقلشده روی مرزِ iMCU قرار نگیرد، بدون اعلام خطا به بالا یا چپ به نزدیکترین مرزِ iMCU منتقل میشود.
- -rotate 90
- چرخاندن ۹۰ درجهای تصویر در جهت عقربههای ساعت.
- -rotate 180
- چرخاندن ۱۸۰ درجهای تصویر.
- -rotate 270
- چرخاندن ۲۷۰ درجهای تصویر در جهت عقربههای ساعت (یا ۹۰ درجه در خلاف جهت عقربهها).
- -transpose
- ترانهادن تصویر (در امتداد محور بالا-چپ به پایین-راست).
- -transverse
- ترانهش متقاطع (در امتداد محور بالا-راست به پایین-چپ).
عملیات ترانهش هیچ محدودیتی در مورد ابعاد تصویر ندارد. سایر تبدیلات در صورتی که ابعاد تصویر مضربی از اندازهٔ iMCU (معمولاً ۸ یا ۱۶ پیکسل) نباشند، رفتار نسبتاً عجیبی دارند، زیرا آنها تنها میتوانند بلوکهای کامل دادههای ضرایب DCT را به شیوهٔ دلخواه تغییر دهند.
رفتار پیشفرض jpegtran هنگام تغییر تصاویر با ابعاد غیرمضرب، به گونهای طراحی شده است که برگشتپذیری دقیق و سازگاری ریاضی مجموعهٔ تبدیلات را حفظ کند. همانطور که بیان شد، ترانهش قادر است کل مساحت تصویر را بازتاب دهد. آینهای کردن افقی و لغزاندن چرخشی، هرگونه ستون ناقص iMCU در لبهٔ راست را دستنخورده باقی میگذارد اما میتواند همهٔ سطرهای تصویر را معکوس یا جابهجا کند. به همین ترتیب، آینهای کردن عمودی و لغزاندن چرخشی، هر سطر ناقص iMCU در لبهٔ پایین را دستنخورده رها میکند اما میتواند همهٔ ستونها را معکوس یا جابهجا کند. سایر تبدیلات را میتوان به صورت توالیهایی از عملیاتهای ترانهش و معکوسسازی پیادهسازی کرد؛ برای حفظ سازگاری، رفتار آنها روی پیکسلهای لبه به گونهای تعریف شده است که با نتیجهٔ نهایی توالی ترانهش و بازتابِ متناظر یکسان باشد.
برای کاربردهای عملی، شاید ترجیح دهید به جای داشتن یک نوار نامتعارف در امتداد لبههای راست و/یا پایین تصویر تبدیلشده، پیکسلهای لبهای غیرقابل تبدیل را دور بریزید. برای انجام این کار، گزینهٔ -trim را اضافه کنید:
- -trim
- حذف بلوکهای لبهای غیرقابل تبدیل.
- بدیهی است که تبدیل همراه با -trim برگشتپذیر نیست، بنابراین از دید دقیق، jpegtran همراه با این گزینه کاملاً بدون افت نخواهد بود. همچنین، همارزیهای ریاضی مورد انتظار میان تبدیلات دیگر برقرار نخواهد بود. برای نمونه، -rot 270 -trim تنها لبهٔ پایینی را برش میدهد، اما -rot 90 -trim که پس از آن -rot 180 -trim اجرا شود، هر دو لبه را برش میدهد.
- -perfect
- اگر تنها به تبدیلات کامل و بینقص علاقهمندید، گزینهٔ -perfect را اضافه کنید. این کار باعث میشود در صورتی که تبدیل بینقص نباشد، jpegtran با یک خطا متوقف شود.
- برای نمونه، شاید بخواهید دستور زیر را اجرا کنید:
- (jpegtran -rot 90 -perfect foo.jpg || djpeg foo.jpg | pnmflip -r90 | cjpeg)
- تا در صورت امکان یک چرخش بینقص انجام شود، و در غیر این صورت یک چرخش تقریبی صورت گیرد.
این نسخه از jpegtran همچنین گزینهٔ برش بدون افت (lossless crop) را ارائه میدهد که دادههای خارج از ناحیهٔ مشخصشدهٔ تصویر را دور میریزد اما محتوای درون آن را بدون افت حفظ میکند. همانند تبدیلات چرخش و بازتاب، برش بدون افت نیز توسط ساختار فرمت کنونی JPEG محدود شده است؛ گوشهٔ بالا سمت چپِ ناحیهٔ انتخابشده باید روی مرز یک iMCU قرار گیرد. اگر چنین نباشد، بدون اعلام خطا به سمت بالا و/یا چپ به نزدیکترین مرز iMCU منتقل میشود (گوشهٔ پایین سمت راست بدون تغییر میماند). بنابراین، تصویر خروجی حداقل ناحیهٔ درخواستشده را پوشش میدهد، اما ممکن است فضای بیشتری را نیز دربرگیرد. تنظیم ابعاد ناحیه را میتوان به صورت اختیاری با افزودن نویسهٔ 'f' (به معنی "force") به عدد عرض یا ارتفاع غیرفعال کرد.
تصویر را میتوان با مشخص کردن این گزینه بدون افت برش داد:
- -crop WxH+X+Y
- برش تصویر به یک ناحیهٔ مستطیلی با پهنای W و بلندی H، با شروع از نقطهٔ X,Y. قابلیت برش بدون افت دادههای خارج از ناحیهٔ معینشدهٔ تصویر را دور میریزد اما آنچه درون آن است را بدون افت حفظ میکند. همانند تبدیلات چرخش و بازتاب، برش بدون افت نیز توسط فرمت کنونی JPEG محدود است؛ گوشهٔ بالا سمت چپ ناحیهٔ انتخابشده باید روی مرز یک iMCU بیفتد. اگر چنین نباشد، بدون اعلام خطا به بالا و/یا چپ به نزدیکترین مرز iMCU منتقل میشود (گوشهٔ پایین سمت راست دستنخورده باقی میماند).
اگر W یا H بزرگتر از پهنا/بلندی تصویر ورودی باشد، اندازهٔ تصویر خروجی گسترش مییابد و ناحیهٔ گسترشیافته با صفرها (خاکستری خنثی) پر میشود. پیوست کردن نویسهٔ 'f' (به معنی "flatten") به عدد پهنا، باعث میشود هر بلوک در ناحیهٔ گسترشیافته به جای پر شدن با رنگ خاکستری، با ضریب DC نزدیکترین بلوک در تصویر ورودی پر شود. پیوست کردن نویسهٔ 'r' (به معنی "reflect") به عدد پهنا باعث میشود ناحیهٔ گسترشیافته به جای خاکستری شدن، با بازتابهای مکرر از تصویر ورودی پر شود.
همانند بازتاب افقی، چرخش ۱۸۰ درجه، چرخش ۲۷۰ درجه و ترانهش متقاطع، گسترش دادن پهنای تصویر با استفاده از گزینهٔ -crop در صورتی که یک ستون ناقص iMCU در لبهٔ راست تصویر وجود داشته باشد، ناکامل خواهد بود. به همین شکل، همانند بازتاب عمودی، چرخش ۹۰ درجه، چرخش ۱۸۰ درجه و ترانهش متقاطع، گسترش دادن بلندی تصویر با استفاده از گزینهٔ -crop در صورتی که یک سطر ناقص iMCU در لبهٔ پایینی تصویر باشد، ناکامل خواهد بود. رفتار پیشفرض jpegtran حفظ بیسروصدای این بلوکهای لبهای غیرقابل تبدیل است، اما میتوان از گزینههای -trim و -perfect برای تغییر این رفتار استفاده کرد.
گزینهٔ مکملِ پاکسازی بدون افت (wipe) نیز تعبیه شده است تا دادههای درون یک ناحیهٔ مشخصشده از تصویر را حذف (خاکستری) کند، در حالی که محتوای بیرونی را بدون افت حفظ مینماید:
- -wipe WxH+X+Y
- پاکسازی (خاکستری کردن) یک ناحیهٔ مستطیلی با پهنای W و بلندی H از تصویر ورودی، با شروع از نقطهٔ X,Y.
پیوست کردن نویسهٔ 'f' (به معنی "flatten") به عدد پهنا، باعث میشود این ناحیه به جای خاکستری شدن، با میانگین بلوکهای مجاور پر شود. اگر ناحیهٔ پاکسازی و ناحیهٔ بیرونی آن، پس از تطبیق با نزدیکترین مرز iMCU، دو مستطیل مجاور افقی تشکیل دهند، پیوست کردن نویسهٔ 'r' (به معنی "reflect") به عدد پهنا سبب میشود که ناحیهٔ پاکسازی با بازتابهای تکراری ناحیهٔ بیرونی پر شود نه اینکه خاکستری شود.
گزینهٔ درج بدون افت (drop) نیز فراهم شده است که امکان میدهد تصویر JPEG دیگری درون دادههای تصویر ورودی در یک موقعیت مشخص جایگذاری («درج») شود و جایگزین دادههای تصویر موجود در آن نقطه گردد:
- -drop +X+Y filename
- درج تصویر دیگری در نقطهٔ X,Y.
هر دو تصویر ورودی و تصویر درجشونده باید سطح زیرنمونهبرداری (subsampling) یکسانی داشته باشند. بهتر است که کوانتیزاسیون (کیفیت) یکسانی نیز داشته باشند. در غیر این صورت، کوانتیزاسیون تصویر خروجی به گونهای تطبیق داده میشود که کیفیت بالاتر میان تصویر ورودی و تصویر درجشونده را لحاظ کند. گزینهٔ trim را میتوان همراه با گزینهٔ drop به کار برد تا تصویر درجشونده را برای مطابقت با تصویر ورودی مجدداً کوانتیزه کند. توجه داشته باشید که میتوان یک تصویر خاکستری (grayscale) را درون یک تصویر تمامرنگی درج کرد یا برعکس، به شرطی که تصویر تمامرنگی فاقد زیرنمونهبرداری عمودی باشد. اگر تصویر ورودی خاکستری و تصویر درجشونده تمامرنگی باشد، کانالهای رنگپذیری (chrominance) تصویر درجشونده دور ریخته خواهند شد.
سایر گزینههای تبدیلی که دقیقاً بدون افت نیستند عبارتند از:
- -grayscale
- اجبار خروجی به مقیاس خاکستری (سیاهوسفید).
- اگر تصویر ورودی YCbCr (یعنی یک JPEG رنگی استاندارد) باشد، این گزینه کانالهای رنگپذیری (chrominance) را دور میریزد و یک فایل JPEG خاکستری تولید میکند. کانال روشنایی (luminance) دقیقاً حفظ میشود، بنابراین این روش برای تبدیل به مقیاس خاکستری، از فرآیند ناهمفشردهسازی، تبدیل و فشردهسازی مجدد بسیار بهتر است. این گزینه به ویژه برای اصلاح یک تصویر تکرنگ که به اشتباه به عنوان JPEG رنگی کدگذاری شده، سودمند است. (در چنین حالتی، صرفهجویی در فضا حاصل از حذف کانالهای کروما که تقریباً خالی هستند چندان زیاد نخواهد بود؛ اما زمان رمزگشایی برای یک JPEG خاکستری به طور چشمگیری کمتر از یک JPEG رنگی است.)
ابزار jpegtran همچنین گزینههای زیر را برای کنترل نحوهٔ رفتار با نشانگرهای «اضافی»، مانند بلوکهای توضیحات (comment)، میشناسد:
- -copy none
- هیچ نشانگر اضافی از فایل منبع کپی نمیشود. این تنظیم تمامی توضیحات و دیگر فرادادههای موجود در فایل منبع را حذف میکند.
- -copy comments
- تنها نشانگرهای توضیحات کپی میشوند. این تنظیم توضیحات را از فایل منبع کپی کرده اما هرگونه فرادادهٔ دیگر را دور میریزد.
- -copy icc
- تنها نشانگرهای پروفایل ICC کپی میشوند. این تنظیم پروفایل ICC را از فایل منبع کپی کرده اما سایر فرادادهها را دور میریزد.
- -copy all
- کپی تمامی نشانگرهای اضافی. این تنظیم نشانگرهای متفرقهٔ یافتشده در فایل منبع مانند بندانگشتیهای JFIF، دادههای Exif و تنظیمات Photoshop را حفظ میکند. در برخی فایلها، این نشانگرهای اضافی میتوانند حجم چشمگیری داشته باشند. توجه داشته باشید که این گزینه بندانگشتیها را همانگونه که هستند کپی میکند؛ آنها تغییر شکل نخواهند یافت.
رفتار پیشفرض -copy comments است. (توجه: در نسخههای v6 و v6a نرمافزار IJG، ابزار jpegtran همواره رفتاری معادل -copy none داشت.)
گزینههای دیگری که توسط jpegtran شناسایی میشوند عبارتند از:
- -icc file
- جایگذاری پروفایل مدیریت رنگ ICC موجود در فایل مشخصشده. توجه داشته باشید که این کار باعث میشود jpegtran از تمامی نشانگرهای APP2 در فایل ورودی چشمپوشی کند، حتی اگر -copy all یا -copy icc مشخص شده باشد.
- -maxmemory N
- تعیین محدودیت برای میزان حافظهٔ مصرفی هنگام پردازش تصاویر بزرگ. مقدار بر حسب هزار بایت است، یا در صورتی که حرف "M" به عدد پیوست شده باشد، بر حسب میلیون بایت خواهد بود. برای نمونه، -max 4m مقدار ۴۰۰۰۰۰۰ بایت را تعیین میکند. اگر حافظهٔ بیشتری نیاز باشد، خطا رخ خواهد داد.
- -maxscans N
- توقف عملیات در صورتی که تصویر ورودی شامل بیش از N پویش (scan) باشد. این ویژگی روشی را نشان میدهد که برنامهها میتوانند از طریق آن در برابر حملات محرومسازی از سرویس (DoS) ناشی از تصاویر ساختگی و معیوب JPEG محافظت کنند؛ تصاویری که شامل پویشهای متعددی با دادههای مفقود تصویر هستند یا دادههای تصویر آنها تنها از «دنبالههای EOB» تشکیل شده است (ویژگیای از تصاویر تدریجی JPEG که امکان میدهد احتمالاً صدها هزار پیکسل با مقدار صفر تنها با چند بایت نمایش داده شوند). تلاش برای تبدیل چنین تصاویر JPEG معیوبی میتواند باعث مصرف بیش از حد پردازنده شود، زیرا بخش ناهمفشردهساز باید هر پویش را (حتی اگر خراب باشد) پیش از رفتن به پویش بعدی کاملاً پردازش کند.
- -outfile name
- ارسال تصویر خروجی به فایلی با نام مشخصشده، نه به خروجی استاندارد.
- -report
- گزارش پیشرفت فرآیند تبدیل.
- -strict
- تلقی تمام هشدارها به عنوان خطای مهلک. این قابلیت نیز روشی را نشان میدهد که برنامهها میتوانند در برابر حملات ناشی از تصاویر JPEG بدساخت و معیوب ایمن شوند. فعال کردن این گزینه باعث میشود اگر تصویر ورودی دارای دادههای ناقص یا خراب باشد، بخش ناهمفشردهساز بیدرنگ متوقف شود.
- -verbose
- فعال کردن چاپ اطلاعات اشکالزدایی. استفاده از تعداد بیشتری -v خروجی بیشتری تولید میکند. همچنین، اطلاعات نسخه در هنگام شروع چاپ میشود.
- -debug
- همانند -verbose.
- -version
- چاپ اطلاعات نسخه و خروج.
مثالها (EXAMPLES)
این مثال یک فایل JPEG مبنا (baseline) را به ساختار تدریجی (progressive) تبدیل میکند:
- jpegtran -progressive foo.jpg > fooprog.jpg
این مثال تصویری را ۹۰ درجه در جهت عقربههای ساعت میچرخاند و هرگونه پیکسلهای لبهای غیرقابل چرخش را دور میریزد:
- jpegtran -rot 90 -trim foo.jpg > foo90.jpg
محیط (ENVIRONMENT)
- JPEGMEM
- اگر این متغیر محیطی تنظیم شده باشد، مقدار آن به عنوان حد حافظهٔ پیشفرض در نظر گرفته میشود. این مقدار همانگونه که برای گزینهٔ -maxmemory توضیح داده شد تعیین میشود. متغیر JPEGMEM مقدار پیشفرضی را که در زمان کامپایل برنامه تعیین شده است بازنویسی میکند، و خودِ آن نیز با تعیین صریح -maxmemory لغو و جایگزین میشود.
همچنین ببینید (SEE ALSO)
cjpeg(1), djpeg(1), rdjpgcom(1),
wrjpgcom(1)
Wallace, Gregory K. "The JPEG Still Picture Compression Standard",
Communications of the ACM, April 1991 (vol. 34, no. 4), pp. 30-44.
نویسندگان (AUTHORS)
Independent JPEG Group
این فایل توسط پروژهٔ libjpeg-turbo ویرایش شده است تا تنها شامل اطلاعات مربوط به libjpeg-turbo باشد و نگارش برخی بخشها بهبود یابد.
گزارش باگها (BUGS)
گزینههای تبدیل نمیتوانند تصاویری با ابعاد غیرمضرب را به صورت بینقص تبدیل کنند. در صورتی که نتایج مطلوب شما نیست، از -trim یا -perfect استفاده کنید.
کل تصویر در حافظه خوانده شده و سپس دوباره نوشته میشود، حتی در مواردی که واقعاً لازم نیست. روی تصاویر بسیار بزرگ، بهویژه هنگام استفاده از گزینههای پیچیدهتر تبدیل، انتظار مبادلهٔ حافظه با دیسک (swapping) را داشته باشید.
| 19 Mar 2026 |