دریافت مشخصات عکس در php نیاز به یک سری از توابع php دارد . داده ها یا اطلاعات ک همراه با یک عکس ذخیره شده اند را ، metadata می نامیم . برای مثال ، نوع عکس ، عرض و طول تصویر ، ویژگی ها ، تاریخ ساخت ، تاریخ آخرین ویرایش (دستکاری) و غیره …
این مشخصات به صورت معمول با مشاهده ساده عکس قابل نمایش نیستند . در این آموزش نحوه دریافت مشخصات عکس در php (یا همان metadata) را بررسی خواهیم کرد.
زبان php ، توابع و DLL های زیادی برای استخراج مشخصات از یک تصویر را در اختیار ما قرار می دهد . این توابع در زیر لیست شده اند :
- imagesx() and imagesy()
- getimagesize()
- exif_read_data()
DLL های مربوطه که باید در هنگام استفاده از توابع بالا فعال باشند php_mbstring.dll و php_exif.dll هستند . برای اطمینان باید این اسامی را در فایل php.ini جستحو کنیم و یا اینکه اگر دسترسی به فایل را نداریم (معمولا در هاست های اشتراکی به اینصورت است) باید از مدیر سرور سوال کنیم .
و نتیجه یافت شده باید به اینصورت باشد :
;extension=php_mbstring.dll
;extension=php_exif.dll
و سپس برای فعال کردن این DLL ها باید ; (سیم کولون) رو از اول خط حذف کنیم . همچنین باید دقت کنیم که باید mbstring بالاتر از exif باشد !
توابع imagesx() و imagesy()
توابع imagesx() و imagesy() به ترتیب برای دریافت عرض و طول تصویر به کار می روند . این توابع دیتا های عکس برگشتی یا ساخته شده به صورت داینامیک توسط php را نیز قبول می کنند . برای مثال ، تصاویر کپچا که به صورت داینامیک توسط php ساخته می شود و برای تفکیک کاربر عادی و ربات به کار می رود . اگر قصد بررسی طول و عرض تصویر کپچایی که ساختیم را داشته باشیم از imagesx() و imagesy() استفاده می کنیم.
Getimagesize()
این متد php یک آرایه از مشخصات عکس مانند طول و عرض ، نوع عکس ، mime type و غیره .. را برمی گرداند . این متد دیتا های محدودی از عکس را برمی گرداند . ولی ، نیاز نیست داده هایی این عکس را در آرگومان این تابع وارد کنیم ، در عوض ، فقط باید آدرس محل تصویر را مشخص کنیم که می تواند به دو صورت نسبی (relative) و یا کامل (absolute) باشد .
اسکریپت php زیر برای استخراج و دریافت مشخصات عکس در php استفاده می شود .
اول از همه ، یک فرم html برای انتخاب فایل عکسی که قصد دریافت مشخصات آن را داریم ، می سازیم .همانطور که در مقاله های قبل هم دید ، برای آپلود فایل توسط فرم html ، باید خاصیت enctype را مشخص کنیم .، البته این خاصیت زمانی که متد ارسالی فرم به صورت post باشد هم قابل استفاده است ، همانند کد زیر :
1 2 3 4 5 6 7 8 9 10 11 |
<html> <head> <title>Getting Image Properties</title> </head> <body> <form name="frmImage" action="" method="post" enctype="multipart/form-data"> <input type="file" name="myImage" /> <input type="submit" name="submit" value="Submit" /> </form> </body> </html> |
بعد از آن ، برای دسترسی به دیتاهای فرم ارسالی توسط اسکریپت php باید کد زیر را بالای فرم html خود اضافه کنیم.
1 2 3 4 5 6 7 8 9 10 |
<?php if(isset($_POST["submit"])) { if(is_array($_FILES)) { $image_properties = getimagesize($_FILES['myImage']['tmp_name']); print "<PRE>"; print_r($image_properties); print "</PRE>"; } } ?> |
این اسکریپت در هنگام زدن دکمه submit فرم اجرا می شود ، و فایل عکس به آرایه سوپر گلوبال اضافه می شود .بعد از گذشت از شرط اینکه $_FILE خالی نیست ، اسم فایل را در تابع getimagesize() مشخص می کنیم. در آخر ، مشخصات عکس به صورت یک آرایه برگردانده و در مرورگر نمایش داده می شود .برای خوانایی بیشتر آرایه آن را داخل تگ های <pre> قرار دادیم .
1 2 3 4 5 6 7 8 9 10 |
Array ( [0] => 1024 [1] => 768 [2] => 2 [3] => width="1024" height="768" [bits] => 8 [channels] => 3 [mime] => image/jpeg ) |
Exif_read_data()
از آنجایی که تابع getimagesize() مشخصات محدودی از تصویر را به ما نشان می داد ، exif_read_data() برای دریافت اطلاعات بیشتری از عکس به کار می رود . به اضافه اطلاعات طول و عرض ، این تابع لیست بزرگی از مشخصات مثل تاریخ ساخت ، تاریخ آخرین دستکاری ، اسم فایل ، حجم ، وضعیت ، رزولیشن و غیره… می دهد
این تباع برای استخراج مشخصات (metadata) های عکس های دیجیتالی که داده Exif در هدر (سربرگ) ذخیره شده است به کار می رود . Exif یک فرمت استاندارد برای تصاویر است .
نوع تصاویر (image types) به طور کل ۱۶ تا هستند . که بسته به دستگاه گرفتن عکس متفاورت است . نوع تصاویر بر اساس شماره برگشت داده می شوند که هرکدام مشخص کننده نوع هایی مثل gif , png,… هستند. برای مثال عدد ۲ مشخص کننده توصویر JPEG است.!
در کد php بالا خط مربوط به getimagesize() را به اینصورت جایگزین کنید .
1 |
$image_properties = getimagesize($_FILES['myImage']['tmp_name']); |
برای دریافت اطلاعات EXIF عکس این خط کد را جایگزین می کنیم
1 |
$image_properties = exif_read_data($_FILES['myImage']['tmp_name']); |
در پایان امیدوارم از مقاله آموزشی دریافت مشخصات عکس در php استفاده کرده باشد.
موفق و پیروز باشید.
عاااااااااااالی…
بعد کلی جست و جوی انگلیسی آخر فارسی جستوجو کردم و با آموزش شما کارم اوکی شد…
سپاس
سلام. خوشحالیم که مفید واقع شده
موفق باشید
سلام
من وقتی از تابع imagesx و imagesy استفاده میکنم، ارور دریافت می کنم و میگه این تابع یافت نشد.
چیکار باید بکنم؟
نگاه کردم املاش هم درست بود اما مشکل داره
سلام. لطفا خطای دقیق رو بفرستید
باسلام
یه سوال دارم
برای کار با رنگ ها تو زبان php حتما باید از کتابخونه پردازش تصویر استفاده کنیم؟؟منظورم اینه که اگه بخام مستقیم روی رنگ های نقشه ی مورد نظرم کار کنم، راهی هست غیر از کتابخونه ی پردازش تصویر…
سوال دیگه ام اینه که اگه راهی نیست،چطور می تونم مختصات پیکسل های مختلف هر عکس رو به دست بیارم روی خود عکس،چون من الان مختصات طول و عرض جغرافیایی رو روی خود نقشه دارم،اگه بخام از کتابخونه پردازش تصویر استفاده بکنم،مشکلم اینه که مختصات واقعی با مختصات عکس یکی نیست و باید به نوعی به هم تبدیل بشن
ممنون میشم راهنماییم کنین،چون واقعا گیر کردم تو این مورد….
سلام.
از کتابخانه imagemagick برای php استفاده کنید
https://imagemagick.org/index.php
تقریبا هر کاری که فکر می کنید میتونید با تصاویر انجام بدید
موفق باشید.
با سلام
یه سوال از خدمتتون دارم
شما در رابطه با کاربرد معادلات افاین تو زبان php برای برداشت مختصات زمینی عکس میتونین من رو راهنمایی کنین؟
میخاستم ببینم کدهای آماده اش موجوده یا نه؟
سلام. بله توابع خود php برای اینکار موجود هست :
https://www.php.net/manual/en/function.imageaffine.php
از کتابخانه های php برای اینکار هم میتونید استفاده کنید :
https://github.com/RnbwNoise/ImageAffineMatrix
https://phpimagick.com/ImagickDraw/affine
موفق باشید.
دستتون درد نکنه
یه سوال دیگه هم دارم…
آیا امکان اینکه از مختصات چهارگوشه ی عکس به مختصات مرکز عکس رسید،هست؟
در این رابطه اگه اطلاعاتی دارین من رو راهنماییم کنین
خیلی ممنونم….
سلام ممنون.
برای دریافت برای دریافت مرکز از تقسیم عرض و ارتفاع بر ۲ استفاده کنید
از تابع imagecopyresampled برای سوال اول استفاده کنید
موفق باشید.
خیلی ممنونم
باسلام
خسته نباشین
من طول و عرض عکسم رو دارم و الان میخام مختصات چهارگوشه ی تصویرم رو در php دریافت کنم
برای اینکار اگه امکان داره راهنماییم کنین
خیلی ممنونم
با سلام
برای دریافت رنگ یه پیکسل از چه تابعی میتونم استفاده کنم, من موقعیت این پیکسل رو روی عکسم دارم,میخام مختصات بدم ورنگش رو ذخیره کنم تو جدولم
سلام
با imagecolorat می توانید با دادن مختصات x,y و متغیر ریسور, رنگ پیکسل مورد نظر را دریافت کنید
به اینصورت :
$color = imagecolorat($rc, $x, $y);
موفق باشید.
سلام
خیلی ممنونم
دو تا نکته
یکی اینکه این تابع imagecolorat سه رنگ قرمز، آبی و سبز رو داره مشخص می کنه، من نیاز به رنگ زردم دارم اون رو چجوری باید دریافت کنم؟نکته ی دیگه هم اینکه من تو ذخیره ای این رنگ هام الان مشکل دارم.این تابع داره نمایش می ده رنگ ها رو. من همه چی مثا ابعاد یه عکس ، تاریخ و نوع و همه اینا رو میتونم ذخیره کنم در دیتابیسم اما رنگ پیکسل رو چجوری باید ذخیره کنم، اگه متوجه منظورم شدین راهنماییم کنین.خیلی مچکرم.
سلام. باید داخل داکیومنت این تابع در سایت php.net به دنبال جوابتون باشید.
مقداری که برگشت داده میشه (رنگ) اگر بصورت رشته هست که خب به راحتی داخل دیتابیس میشه ذخیره کرد درغیر اینصورت چون به صورت آریه ای است ایندکسش رو مشخص کنید و بعد ذخیره کنید به اینصورت :
$rgb = imagecolorat($pixel, x, y);
$color = imagecolorsforindex($pixel, $rgb);
موفق باشید.
بله
متوجه شدم
دستتون دردنکنه
هم به دلیل راهنماییون
هم بابت زود جواب دادن به سوالات و مشکلات.
خیلی ممنونم
باسلام
برای دریافت اطلاعات x,y یه پیکسل از عکس و ذخیره اش توی پایگاه داده از چه کدی باید استفاده کرد
سلام.
از توابع imagesx و imagesy استفاده کنید.
موفق باشید.
سلام
خیلی ممنونم از پاسخ گوییتون
یک سوال دیگه هم دارم
برای پردازش تصویر در زبان php فقط میشه از کتابخونه gd استفاده کرد یا opencv هم امکان پذیره ؟؟
سلام. بله امکانش هست. فقط باید روی سرور نصبش کنید که اگر هاست اشتراکی هست که امکانش نیست.
روی لینوکس هم که با سرچ میتونید پیدا و نصب کنید.
برای استفاده از opencv هم میتونید از کتابخانه php اماده مربوطه بهره ببرید
https://github.com/php-opencv/php-opencv
موفق باشید.
خیلی ممنونم از راهنماییتون