Tifftopnm User Manual(0) Tifftopnm User Manual(0)

tifftopnm - تبدیل یک فایل TIFF به تصویر PNM

tifftopnm

[-alphaout={alpha-filename,-}] [-headerdump] [-verbose] [-respectfillorder] [-byrow] [-orientraw] [tiff-filename]

این برنامه بخشی از Netpbm(1) است.

برنامه tifftopnm یک فایل TIFF را به‌عنوان ورودی خوانده و یک تصویر PNM به‌عنوان خروجی تولید می‌کند. نوع فایل خروجی به فایل ورودی بستگی دارد - اگر سیاه‌وسفید باشد، tifftopnm یک تصویر PBM تولید می‌کند؛ اگر در مقیاس خاکستری باشد، یک تصویر PGM تولید می‌کند؛ در غیر این صورت، خروجی PPM خواهد بود. برنامه نوعی را که در حال نوشتن آن است به شما اعلام می‌کند.

اگر فایل TIFF حاوی چندین تصویر باشد (چندین «دایرکتوری»)، tifftopnm یک جریان خروجی PNM چندتصویری تولید می‌کند. با این حال، پیش از Netpbm 10.27 (مارس ۲۰۰۵)، تمام تصاویر ورودی به‌جز تصویر اول نادیده گرفته می‌شدند.

آرگومان tiff-filename نام فایلی است که تصویر TIFF را در بر دارد. اگر «-» را مشخص کنید یا این آرگومان را تعیین نکنید، tifftopnm از ورودی استاندارد (Standard Input) استفاده می‌کند.

در هر دو حالت، پیش از Netpbm 10.70 (مارس ۲۰۱۵)، فایل باید قابلیت پرش (seekable) می‌داشت. به این معنی که امکان استفاده از pipe وجود نداشت، اما هر فایل عادی قابل قبول بود. در نسخه‌های کنونی Netpbm نیازی به seekable بودن فایل نیست، اما اگر نباشد، tifftopnm یک فایل عادی موقت شامل کل تصویر ایجاد می‌کند، بنابراین باید منابع لازم برای آن را در اختیار داشته باشید (و این موضوع ممکن است دلیل شما برای استفاده از pipe را بی‌اثر کند).

برنامه pamtotiff از کتابخانه TIFF موجود در Libtiff.org (یا هر معادل دیگری که ارائه دهید) برای تفسیر ورودی TIFF استفاده می‌کند؛ بنابراین مجموعه فایل‌هایی که قادر به تفسیر آن‌ها است عمدتاً توسط آن کتابخانه مشخص می‌شود.

این برنامه نمی‌تواند هر فایل TIFF ممکنی را بخواند -- چرا که تغییرات و گونه‌های بی‌شماری از قالب TIFF وجود دارد. با این حال، فایل‌های TIFF با رنگ‌های تک‌رنگ (monochrome)، مقیاس خاکستری (grayscale)، RGB، RGBA (قرمز/سبز/آبی همراه با کانال شفافیت)، CMYK (تفکیک رنگ جوهر Cyan-Magenta-Yellow-Black) و پالت رنگی را درک می‌کند. یک فایل RGB می‌تواند ساختار رنگی تک‌صفحه‌ای (interleaved) یا چندصفحه‌ای داشته باشد. این برنامه ورودی‌های ۱ تا ۸ و ۱۶ بیت در هر نمونه (bit-per-sample) را می‌خواند که مورد آخر می‌تواند با کدگذاری bigendian یا littlendian باشد. اطلاعات دایرکتوری TIFF نیز ممکن است bigendian یا littlendian باشد.

قالب‌های TIFF متعددی وجود دارد که tifftopnm تنها در صورتی می‌تواند آن‌ها را بخواند که تصویر به اندازه کافی کوچک باشد تا در حافظه جا بگیرد. tifftopnm در صورتی از تابع TIFFRGBAImageGet() متعلق به کتابخانه TIFF برای پردازش تصویر استفاده می‌کند که حافظه کافی در دسترس باشد تا TIFFRGBAImageGet() بتواند کل تصویر را یک‌باره در حافظه ذخیره کند (کاری که TIFFRGBAImageGet() انجام می‌دهد). در غیر این صورت، tifftopnm از یک راهبرد تبدیل سطر به سطر ابتدایی‌تر با استفاده از داده‌های خام دریافت‌شده از TIFFReadScanLine() و منطق داخلی خود استفاده می‌کند. این منطق داخلی به اندازه TIFFRGBAImageGet() قالب‌های مختلف را نمی‌شناسد، و برخی از قالب‌های فشرده‌شده را اساساً نمی‌توان با TIFFReadScanLine() خواند.

پیش از Netpbm 10.11 (اکتبر ۲۰۰۲)، tifftopnm هرگز از TIFFRGBAImageGet() استفاده نمی‌کرد، بنابراین قادر نبود بسیاری از قالب‌هایی را که امروزه درک می‌کند تفسیر نماید.

هیچ دلیل بنیادینی وجود ندارد که این برنامه نتواند انواع دیگر فایل‌های TIFF را، حتی زمانی که کل آن‌ها به‌طور هم‌زمان در حافظه جا نمی‌شوند، بخواند. محدودیت‌های فعلی عمدتاً به این دلیل است که تاکنون کسی درخواست پشتیبانی بیشتری نکرده است.

خروجی PNM دارای مقدار maxval یکسانی با ورودی Tiff است، به جز زمانی که ورودی Tiff دارای نگاشت رنگی (colormapped) باشد (که مستلزم یک maxval برابر با ۶۵۵۳۵ است)؛ در این صورت خروجی PNM دارای maxval برابر با ۲۵۵ خواهد بود. اگرچه این امر ممکن است منجر به از دست رفتن اطلاعات شود، اما چنین تصاویر ورودی به‌ندرت تفکیک‌پذیری رنگی بیشتری از آنچه یک maxval برابر با ۲۵۵ فراهم می‌کند دارند و کاربران معمولاً نمی‌توانند با فایل‌های PNM با مقدار maxval > 255 کار کنند. در مقابل، یک تصویر Tiff فاقد نگاشت رنگ که نیازی به maxval > 255 ندارد، خود نیز فاقد یک maxval > 255 است؛ بنابراین هنگامی که tifftopnm یک maxval > 255 بدون نگاشت رنگ را می‌بیند، آن را جدی گرفته و یک maxval منطبق در خروجی تولید می‌کند.

استثنای دیگر حالتی است که TIFF maxval بزرگ‌تر از ۶۵۵۳۵ باشد، که حداکثر مقدار مجاز در قالب‌های Netpbm است. در آن حالت، tifftopnm از یک maxval برابر با ۶۵۵۳۵ استفاده می‌کند و شما بخشی از اطلاعات را در تبدیل از دست خواهید داد.

علاوه بر گزینه‌های مشترک بین تمامی برنامه‌های مبتنی بر libnetpbm (به‌ویژه -quiet، به گزینه‌های مشترک (Common Options) مراجعه کنید)، tifftopnm گزینه‌های خط فرمان زیر را به رسمیت می‌شناسد:

می‌توانید هر گزینه را به کوتاه‌ترین پیشوند یکتای آن مخفف کنید. می‌توانید به جای یک خط تیره از دو خط تیره در گزینه‌ها استفاده کنید. می‌توانید یک گزینه و مقدار آن را با علامت مساوی یا فاصله (whitespace) از یکدیگر جدا کنید.

tifftopnm یک فایل PGM حاوی مقادیر کانال آلفا در تصویر ورودی ایجاد می‌کند. اگر تصویر ورودی فاقد کانال شفافیت باشد، فایل alpha-filename تماماً حاوی مقادیر صفر (کاملاً شفاف) برای شفافیت خواهد بود. اگر -alphaout را مشخص نکنید، tifftopnm فایل شفافیت تولید نمی‌کند، و چنانچه تصویر ورودی دارای کانال شفافیت باشد، tifftopnm به‌سادگی آن را نادیده می‌گیرد.

اگر - را به عنوان نام فایل مشخص کنید، tifftopnm خروجی شفافیت را در خروجی استاندارد (Standard Output) می‌نویسد و از تصویر صرف‌نظر می‌کند.

برای دیدن یکی از روش‌های استفاده از فایل خروجی شفافیت، به pamcomp(1) مراجعه کنید.

به‌طور پیش‌فرض، tifftopnm برچسب «fillorder» را در ورودی TIFF نادیده می‌گیرد، که به این معنی است که ممکن است تصویر را به نادرستی تفسیر کند. برای اینکه از مشخصات استاندارد تبعیت کند، از این گزینه استفاده کنید. برای بحثی مفصل اما جذاب درباره اینکه چرا tifftopnm بدین صورت عمل می‌کند و نحوه استفاده از گزینه -respectfillorder، به یادداشت مربوط به fillorder در ادامه مراجعه کنید.
این گزینه می‌تواند باعث شود tifftopnm سریع‌تر اجرا شود.

tifftopnm برای انجام تبدیل از Tiff به PNM دو روش دارد که به ترتیب از دو قابلیت کتابخانه TIFF بهره می‌برند:

رمزگشایی یک‌باره کل تصویر در حافظه با استفاده از TIFFRGBAImageGet()، سپس تبدیل به PNM و ارسال به خروجی به‌صورت سطر به سطر.
خواندن، تبدیل و خروجی دادن هر بار یک سطر با استفاده از TIFFReadScanline()

روش Whole Image ترجیح داده می‌شود زیرا کتابخانه Tiff بخش بیشتری از کار را انجام می‌دهد، که به این معناست که قابلیت‌های بیشتری از قالب Tiff را در حال حاضر و آینده درک می‌کند. همچنین، برخی قالب‌های فشرده TIFF امکان استخراج یک سطر جداگانه را نمی‌دهند.

روش Row By Row حافظه بسیار کمتری مصرف می‌کند، به این معنی که با تصاویر بزرگ، می‌تواند در محیط‌هایی اجرا شود که Whole Image امکان‌پذیر نیست و همچنین ممکن است سریع‌تر اجرا شود. و از آنجا که کد Netpbm بخش بیشتری از کار را انجام می‌دهد، این امکان وجود دارد که انعطاف‌پذیرتر باشد یا حداقل در صورت وجود اشکالی در TIFF، اطلاعات تشخیصی بهتری ارائه دهد.

کد بومی Netpbm ممکن است کاری را به درستی انجام دهد که کتابخانه TIFF به نادرستی انجام می‌دهد، یا برعکس.

در Netpbm، ما قابلیت عملکردی را بر کارایی ترجیح می‌دهیم، بنابراین به‌طور پیش‌فرض ابتدا Whole Image را امتحان می‌کنیم، و اگر نتوانیم حافظه کافی برای تصویر رمزگشایی‌شده به دست آوریم یا TIFFRGBAImageGet() با شکست مواجه شود، به Row By Row بازمی‌گردیم. اما اگر گزینه -byrow را مشخص کنید، tifftopnm روش Whole Image را امتحان نخواهد کرد. اگر Row By Row کار نکند، برنامه به‌سادگی با خطا خاتمه می‌یابد.

برای شرح حالتی که در آن Row By Row تفاوت چشمگیری در نتایج شما ایجاد می‌کند، به تصاویر تفکیک رنگ (CMYK) در TIFF مراجعه کنید.

روش Whole Image زمانی که تصویر TIFF شما بیش از ۸ بیت به ازای هر نمونه (sample) استفاده می‌کند، باعث افت دقت می‌شود. تابع TIFFRGBAImageGet() نمونه‌ها را به ۸ بیت تبدیل می‌کند. سپس tifftopnm آن‌ها را مجدداً به maxval برابر با ۶۵۵۳۵ مقیاس‌بندی می‌کند، اما ۸ بیت اطلاعات پایین‌تر از دست رفته است.

در بسیاری از نسخه‌های کتابخانه TIFF، تابع TIFFRGBAImageGet() فایل‌های TIFF را که در آن‌ها جهت‌گیری رستر ستون‌محور (column-major) است (یعنی یک سطر از رستر، ستونی از تصویر است) به‌درستی تفسیر نمی‌کند. با چنین کتابخانه و فایلی، برای دریافت خروجی درست باید از -byrow استفاده کنید.

پیش از Netpbm نسخه 10.11 (اکتبر ۲۰۰۲)، tifftopnm همواره به روش Row By Row عمل می‌کرد. Netpbm نسخه 10.12 همواره ابتدا Whole Image را امتحان می‌کرد. گزینه -byrow همراه با Netpbm نسخه 10.13 (ژانویه ۲۰۰۳) معرفی شد.

یک جریان TIFF حاوی داده‌های رستری است که می‌توانند به روش‌های گوناگونی در جریان چیده شوند. معمولاً این داده‌ها به صورت سطری مرتب می‌شوند، با بالاترین سطر در ابتدا، و پیکسل‌ها از چپ به راست در هر سطر، اما بسیاری از جهت‌گیری‌های دیگر نیز ممکن هستند.

جهت‌گیری معمول همان موردی است که قالب‌های Netpbm استفاده می‌کنند، بنابراین هنگامی که رستر TIFF به آن صورت جهت‌گیری شده باشد، tifftopnm می‌تواند وظایف خود را بسیار کارآمد انجام دهد.

اما اگر رستر TIFF به هر شکل دیگری جهت‌گیری شده باشد، تبدیل آن به قالب Netpbm ممکن است به میزان قابل توجهی پردازش توسط tifftopnm نیاز داشته باشد.

گزینه -orientraw اعلام می‌کند که تصویری خروجی تولید شود که بیانگر رستر خام درون جریان TIFF باشد، نه تصویری که انتظار می‌رود جریان TIFF نمایانگر آن باشد. در خروجی، گوشه بالا سمت چپ منطبق بر ابتدای رستر TIFF است، پیکسل بعدی به سمت راست همان پیکسل بعدی در رستر TIFF است و غیره. tifftopnm می‌تواند این کار را به آسانی انجام دهد، اما شما تصویر درستی دریافت نمی‌کنید. می‌توانید از pamflip استفاده کنید تا خروجی را به تصویری که جریان TIFF نمایش می‌دهد تبدیل کنید (اما اگر این کار را انجام دهید، عملاً مزیت -orientraw را از دست خواهید داد).

با این گزینه، tifftopnm همیشه از روش Row By Row استفاده می‌کند (به -byrow مراجعه کنید).

این گزینه در Netpbm نسخه 10.42 (مارس ۲۰۰۸) جدید بود. پیش از آن، tifftopnm معمولاً با تصاویر TIFF که جهت‌گیری غیر از حالت متداول داشتند، نتایجی دلخواه و غیرقابل پیش‌بینی تولید می‌کرد.

پیام‌های بیشتری درباره تبدیل در خطای استاندارد (Standard Error) چاپ می‌کند.
اطلاعات فایل TIFF را نیز در stderr تخلیه (dump) می‌کند. این اطلاعات ممکن است در اشکال‌زدایی مشکلات تبدیل فایل TIFF مفید باشد.

در سرآیند یک تصویر TIFF، اطلاعاتی با عنوان «fillorder» وجود دارد. مشخصات فنی TIFF به‌روشنی بیان می‌کند که این مقدار، ترتیب چیدمان بیت‌ها را درون یک بایت هنگام توصیف پیکسل‌های تصویر تعیین می‌کند. با فرض این‌که قالب تصویر طوری باشد که بیش از یک پیکسل در یک بایت واحد نمایش داده شود، دو حالت وجود دارد: ۱) بایت از باارزش‌ترین بیت (MSB) به کم‌ارزش‌ترین بیت (LSB) از چپ به راست در تصویر پر می‌شود؛ و ۲) حالت برعکس آن.

با این وجود، درک نادرست و سردرگمی زیادی دربارهٔ معنای fillorder وجود دارد. شواهد نشان می‌دهد برخی از افراد گمان می‌کنند این مفهوم مربوط به ترتیب بایت‌ها (byte order) در مواردی است که یک مقدار منفرد توسط دو بایت نمایش داده می‌شود.

این افراد باعث ایجاد تصاویری با فرمت TIFF می‌شوند که اگرچه در عمل از ترتیب پر کردن MSB-to-LSB استفاده می‌کنند، اما برچسب fillorder آن‌ها نشان می‌دهد از LSB-to-MSB استفاده شده است. در این حالت، برنامه‌ای که تصویر TIFF را به‌درستی تفسیر کند، نتیجه‌ای متفاوت از آن‌چه سازندهٔ تصویر در نظر داشته ارائه خواهد داد.

برای مدتی طولانی، tifftopnm خود مقدار fillorder را درک نمی‌کرد و بدون در نظر گرفتن برچسب fillorder در سرآیند TIFF، همواره فرض را بر این می‌گذاشت که fillorder از نوع MSB-to-LSB است. تا آنجا که مشخص است، هیچ دلیل موجهی برای استفاده از ترتیبی به‌جز MSB-to-LSB وجود ندارد؛ بنابراین کاربران tifftopnm با رضایت از همان تصاویر TIFF که برچسب‌های fillorder نادرستی داشتند استفاده می‌کردند.

برای اینکه این دسته از کاربران همچنان بدون مشکل به کار خود ادامه دهند، امروزه نیز tifftopnm برچسب fillorder را نادیده می‌گیرد، مگر اینکه صریحاً خلاف آن را مشخص کنید (با این حال، هرگاه برچسب fillorder مقداری به‌جز MSB-to-LSB داشته باشد، هشدار می‌دهد که برچسب در حال نادیده گرفته شدن است).

اگر بنا به دلایلی یک تصویر TIFF در اختیار دارید که واقعاً ترتیب پر کردن آن LSB-to-MSB است و برچسب fillorder آن نیز به‌درستی به این نکته اشاره دارد، باید از گزینهٔ -respectfillorder در tifftopnm استفاده کنید تا خروجی صحیحی به دست آورید.

نمونه‌هایی از تصاویر نادرست TIFF در آدرس زیر وجود دارند: ftp://weather.noaa.gov این تصاویر ظاهراً توسط برنامه‌ای به نام faxtotiff ایجاد شده‌اند.

این یادداشت در ۱ ژانویه ۲۰۰۲ نوشته شده است.

برخی از تصاویر TIFF اطلاعات رنگ را در قالب CMYK ذخیره می‌کنند، در حالی که تصاویر PNM از RGB استفاده می‌کنند. فرمول‌های گوناگونی برای تبدیل میان این دو قالب وجود دارد و tifftopnm می‌تواند از هر یک از دو روش بهره ببرد.

کتابخانهٔ TIFF (نسخهٔ 3.5.4 از libtiff.org) در سرویس TIFFRGBAImageGet() خود از فرمول Y=(1-K)*(1-B) (به طور مشابه برای R و G) استفاده می‌کند. زمانی که tifftopnm در حالت تصویر کامل (Whole Image) کار می‌کند، از این سرویس بهره می‌برد؛ بنابراین این همان تبدیلی است که دریافت می‌کنید.

اما هنگامی که tifftopnm در حالت سطر به سطر (Row By Row) اجرا می‌شود، از TIFFRGBAImageGet() استفاده نمی‌کند و تبدیلی به دست می‌آورید که به‌نظر کاربردی‌تر می‌آید: Y=1-(B+K). این حالت معکوس عملکرد pnmtotiffcmyk است.

برای اطلاعات بیشتر دربارهٔ مقایسهٔ حالت تصویر کامل (Whole Image) در برابر حالت سطر به سطر (Row By Row)، گزینهٔ -byrow را ببینید.

پیش از نسخهٔ Netpbm 10.21 (مارس ۲۰۰۴)، tifftopnm همواره از فرمول Y=(1-K)*(1-B) استفاده می‌کرد.

pnmtotiff(1), pnmtotiffcmyk(1), pamcomp(1), pnm(1)

برگرفته‌شده توسط Jef Poskanzer از tif2ras.c، با کپی‌رایت (c) ۱۹۹۰ متعلق به Sun Microsystems, Inc. نویسنده: Patrick J. Naughton (naughton@wind.sun.com).

این صفحهٔ راهنما توسط ابزار Netpbm یعنی 'makeman' از منبع HTML تولید شده است. مستندات اصلی در نشانی زیر قرار دارد:

http://netpbm.sourceforge.net/doc/tifftopnm.html
02 January 2015 netpbm documentation