Exif (کوتاه شده Exchangeable image information)، ویژگی درون پی اچ پی است که می توان با آن داده هایی را از تصویرهای گرفته شده با دوربین ها بدست بیاوریم. کتابخانه Exif در پی اچ پی دارای تابع های  که هر کدام را در زیر نوشته ایم. این تابع ها بر روی فرمت های JPG و JPEG کار کرده و نمی توان آنها را برای فرمت PNG به کار ببریم.

  • ()exif_image_type: گونه تصویر را نشان می دهد.
  • ()exif_read_data: بخش سرآیندهای Exif (یا Exif Headers) فایل تصویری را می خواند.
  • ()exif_tagname: نام سرآیند را برای یک اندیس (Index) برگشت می دهد.
  • ()exif_thumbnail: این تابع Thumbnail تعبیه شده درون یک تصویر را برگشت می دهد.
  • ()read_exif_data: یک نام مستعار برای تابع ()exif_read_data است.

خواندن داده های Exif با ()exif_read_data

در کد زیر متغیری به نام filename$ ساخته ایم که مسیر یک فایل JPG را در خود نگه می دارد. (این فایل نمونه ای است که می توانید دانلود کنید). سپس این متغیر به تابع ()exif_read_data فرستاده شده و برآیند (نتیجه) انجام آن در متغیری به نام image_data$ ریخته می شود. اگر تابع به درستی انجام شود، از این پس آرایه انجمنی است که هر یک از کلیدهای آن مانند FileName و Make و Model یکی از داده های Exif را در خود نگه می دارد.

شکل سمت چپ خروجی تابع ()exif_read_data را برای تصویر sample.jpg و شکل سمت راست، داده های Exif یک فایل از سایت Flickr را نشان می دهد. البته لزومی ندارد که یک تصویر JPG همه داده های شکل سمت راست را داشته باشد ولی این را به یاد داشته باشید که فرمت PNG توسط کتابخانه Exif پشتیبانی نمی شود. برای نمونه شما می توانید تصویرهای گرفته شده از دوربین گوشی همراه خود را امتحان کنید.

بررسی فرمت فایل با تابع ()exif_imagetype

گفتیم که کتابخانه Exif فرمت PNG را نمی شناسد و در صورتی که فایل PNG به ()exif_read_data فرستاده شود، پس یک خطا نمایش داده می شود، بنابراین بهتر است از نمایش خطای PHP پیش گیری کرده و در صورت فرستاده شدن یک فایل PNG، خطای مطلوب خویش را نمایش دهیم. توجه کنید که پی اچ پی کاری به فرمت فایل ندارد، بلکه با ساختار درونی آن کار می کند، از این رو اگر فایل PNG که فرمت آن را jpg. نوشته باشیم، بازهم خطا نشان داده می شود.

کد زیر تابع ()exif_imagetype را به کار برده است که خروجی آن یک عدد صحیح است که نوع فرمت فایل تصویری را نشان می دهد که برای نمونه شماره ۲ برابر با این است که فایل از نوع JPG یا JPEG است. بنابراین در کد زیر در if اول بررسی می شود که آیا فرمت تصویر JPG هست یا نه، اگر اینگونه بود، پس فایل تصویری با متد ()exif_read_data خوانده شده، سپس برای اطمینان بیشتر بررسی می شود که آیا بخش سرایند فایل خوانده شده یا نه؟ اگر خوانده نشود، پس مقدار درون متغیر image_data$ برابر با false خواهد بود.

شکل زیر برخی از ثابت های از پیش نوشته شده درون پی اچ پی را نشان می دهد که هر یک به یک شماره صحیح اشاره دارند و همچنین هر کدام به یک نوع فرمت فایل اشاره می کنند. بای نمونه می توانید از if نخستین بالا، به جای شماره ۲، ثابت IMAGETYPE_JPEG را به کار ببرید.

خواندن محتولی یک دایرکتوری (پوشه) در  اچ پی و انتخاب برخی از فرمت های دلخواه

در کد زیر نخست یه آرایه معمولی به نام extensions$ با دو عضو رشته ای jpg و jpeg ساخته ایم. سپس متغیر dir$ تعریف می شود که درون آن مسیر یک دایرکتوری نگهداری می شود. سپس درون یک عبارت if .. else نخست به کمک ()empty بررسی می شود که آیا متغیر dir$ دارای مقدار هست یا نه؟ اگر باشد، پس به کمک تابعی به نام ()scandir همه محتوای مسیر در متغیری به نام files$ ریخته می شود وگرنه به کمک تابع ()getcwd همه محتوای مسیر دایرکتوری جاری در متغیر files$ ریخته خواهد شد.

سپس درون یک حلقه foreach هر یک از نام فایل های درون متغیر files$ را می خوانیم و در آغاز به کمک تابع ()strtolower همه حرف های آن را به حروف کوچک تبدیل می کنیم زیرا درون آرایه extensions$ دو رشته کوچک jpg و jpeg داریم. سپس از تابع ()explode کمک می گیریم تا نام هر فایل را از طریق کاراکتر نقطه به دو بخش نام و پسوند فایل بشکنیم. متغیر parse_file_name$ یک آرایه که یکی از عنصرهای آن نام فایل و دیگری پسوند فایل (بدون نقطه مانند jpg یا pdf) است که این پسوند واپسین عنصر درون آرایه نیز هست. اکنون برای اینکه به واپسین عنصر درون آرایه اشاره کنیم، تابعی به نام ()end را به کار می بریم. تابع ()end یکی از تابع های آرایه ها است که آخرین عنصر درون آرایه را برکشت می دهد. بنابراین از این پس، متغیر file_extension$ به پسوند نام فایل اشاره دارد.

توجه کنید برای این از ()end برای دسترسی به واپسین عنصر درون لیست اشاره می کنیم، زیرا نمی دانیم چه شماری عنصر درون آرایه هست. برای نمونه نام فایل به صورت filename.part.jpg باشد، بنابراین شکستن نام فایل بر پایه نقطه آرایه ای سه عنصری را پدید می آورد و چون نام پسوند فایل واپسین بخش نام هر فایل است، پس به جای استفاده از شماره اندیس، یکباره با ()end به واپسین عنصر اشاره می کنیم.

کد زیر بازنویسی شده کد پیشین است که در آن به جای نمایش همه عنصرهای آن، تنها بخشی از داده ها را نمایش می دهیم. توجه کنید آرایه انجمنی است، پس اندیس های آن کلیدهایی هستند که در اینجا به صورت رشته هایی هستند. برای نمونه اگر بخواهیم مدل دوربین ر پیدا کنیم، دستور زیر را به کار برده ایم:

برای نمونه تصویری که در این نوشته به کار برده می شود، به کمک Iphone 4 گرفته شده است. همچنین گفتیم کلیدی مانند COMPUTED خودش یک زیر آرایه انجمنی است، پس کدهای زیر، بخشی از داده های این آرایه درونی مانند پهنا (Width) و درازا (ارتفاع Height) تصویر را برگشت می دهد.