اینترنت پنجره ها اندروید

ویژگی های پی اچ پی کار با تصاویر. راهنمای بارگیری کامل تصویر به پی اچ پی

مقاله نحوه کار با فرمت PHP - GDLIB را توصیف می کند، که به شما اجازه می دهد تا تصاویر را به صورت پویا بر روی صفحات وب فرم کنید.
نویسنده - نیکوه (نیکو)
ترجمه از فرانسوی - آنتون فدورچنکو
آدرس اصلی - http://www.phpdebutant.org/article111.php

برای درک این مقاله، لازم است که ایده های ابتدایی ابتدایی پی اچ پی و همچنین کار با تصاویر داشته باشیم.

یادداشت مترجم

در نمونه ها، تمام نامهای شناسه به زبان فرانسه داده می شود. به منظور تسهیل درک خواننده از کد، ما ترجمه خود را ارائه می دهیم:
بلان - سفید
bLEU - آبی
couleur - رنگ
couleur_Fond - رنگ پس زمینه
fichier - فایل
گریس - خاکستری
hauteur - ارتفاع
hauteurImage - ارتفاع تصویر
bargur - عرض
bILLURIMAGE - عرض تصویر
mOIS - ماه
noir - سیاه
پلیس - هدست فونت
روژ - قرمز
تابلو فرش - آرایه
ارزش - سبز

یادداشت مترجم

به طور پیش فرض، در PHP 5، تمام پسوندها غیر فعال هستند، از جمله یک فرمت برای ایجاد تصاویر پویا - GD. برای دستورالعمل برای تنظیم این گسترش، باید با یک مقاله تماس بگیرید.

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

کتابخانه GD مجموعه ای از ویژگی های کار با تصاویر است. با تشکر از او، ممکن است نه تنها به صورت پویا تصاویر خود را ایجاد، بلکه همچنین برای دریافت اطلاعات مختلف در مورد آنها، تغییر اندازه، و غیره

توجه: قبل از شروع کار، باید چیزی را بدانید. واقعیت این است که چندین نسخه مختلف از این فرمت پی اچ پی وجود دارد و ارائه دهندگان خدمات میزبانی می توانند توابع خاص و حتی کل کتابخانه GD را غیرفعال کنند. برای چه هدف؟ شناخته شده است که پردازش تصویر یک بار بزرگ بر روی سرور است.

بنابراین، شما باید نسخه کتابخانه GD را که در میزبانی که استفاده می کنید، می دانید، و همچنین اطلاعات مربوط به توابع مجاز را دریافت کنید. اولین کاری که باید انجام شود این است که از عملکرد phpinfo استفاده کنید. اسکریپت زیر را انجام دهید:

phpinfo.php.

phpinfo ()؛
?>

اگر یک جدول مشابه این را داشته باشید - همه چیز خوب است (به ویژه اگر نسخه کتابخانه جدیدتر از 2.0 باشد)

GD

پشتیبانی GD

نسخه GD

پشتیبانی Freetype

پیوند Freetype

پشتیبانی JPG

پشتیبانی PNG

پشتیبانی WBMP

همانطور که در بالا ذکر شد، برخی از امکانات را می توان غیر فعال کرد. در این مورد، شما باید سعی کنید از یک تابع استفاده کنید. اگر این منجر به یک خطا می شود: خطای مرگبار: تماس با تابع تعریف نشده، - شما نباید شک داشته باشید که این تابع غیر فعال است.

من) ایجاد بوم

ابتدا باید بوم خالی ایجاد کنید. بلافاصله توضیح دهید که در این مقاله فقط به تصاویر در فرمت PNG یا JPG می گویم، فرمت GIF بدون توجه ما باقی خواهد ماند. واقعیت این است که این فرمت توسط کتابخانه GD متوقف شده است، با شروع از نسخه 1.3، هرچند پشتیبانی محدود از GIF دوباره در نسخه 2 ظاهر شد. نتیجه گیری: فرمت PNG یک جایگزین سودمند برای GIF است

یادداشت مهم

در تمام دوره های آموزشی سایت www.phpdebutant.org، اسکریپت ها هدف قرار دادن پویای صفحات HTML را هدف قرار دادند. این بار، با استفاده از کتابخانه GD، ما تصاویر را ایجاد می کنیم، بنابراین در این مورد باید در طول طراحی اکو و چاپ را فراموش کنید. به طور پیش فرض، اسکریپت پی اچ پی یک صفحه HTML تولید می کند که به شکل ارسال یک HTTP هسته ای نیاز به توضیح ندارد. اما اگر یک تصویر ایجاد کنیم، در ابتدای اسکریپت، باید نوع آن را مشخص کنید، هدر مربوطه را ارسال کنید، به عنوان مثال برای PNG: Header ("نوع نوع: تصویر / PNG")؛

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

imageVide.php.

سربرگ ("نوع نوع: تصویر / PNG")؛
$ IM \u003d ImageCreate (200، 100)
یا مرگ ()؛
$ couleur_fond \u003d imagecolorallocate ($ im، 255، 0، 0)؛
imagePNG ($ im)؛
?>

این اسکریپت کوچک یک مستطیل قرمز (بسیار کم، اما شروع خوب) تولید می کند. شرح مکانیزم:

  • تابع ImageCreate، توصیفگر $ IM را باز می گرداند. توصیفگر $ IM باید به تمام توابع طراحی تصویر منتقل شود. پارامترهای تابع ImageCreate مربوط به طول و عرض تصویر ایجاد شده (200x100).
  • وظیفه اپراتور یا مرگ - رهگیری از خطاهای احتمالی.
  • ایجاد رنگ را می توان با استفاده از تابع ImageColorAllocate ایجاد کرد. آن را استفاده می شود
    • ایجاد رنگ و حفظ آن در یک متغیر به منظور استفاده بعدی
    • اضافه کردن رنگ به $ im image palette

پارامترهای آن مربوط به اجزای قرمز، سبز و آبی رنگ و نشان دهنده عدد صحیح از 0 تا 255 است. در این مثال، ما یک رنگ قرمز ایجاد کردیم.

یادداشت مهم

این رنگ مربوط به رنگ پس زمینه است، زیرا اولین بار به پالت تصویر اضافه می شود.

تماس یک اسکریپت ImageVide.php (empty_ .php) یک تصویر را در فرمت PNG ایجاد می کند. به منظور استفاده از آن در وب سایت، شما باید در مورد تصاویر "کلاسیک" عمل کنید.

کاملا آسان است! شما حتی می توانید پارامترهای اسکریپت را انتقال دهید که یک تصویر (به عنوان مثال، رنگ پس زمینه) تولید می کند.

بنابراین شما در حال حاضر برخی از دانش پایه ای برای شروع طراحی. اگر می خواهید آنها را عمیق تر کنید - در اینجا برخی از ویژگی های جالب وجود دارد

  • شما می توانید ImageCreate را در ImageCreateOlor جایگزین کنید تا یک تصویر 32 بیتی ایجاد کنید (مناسب برای عکس ها)
  • شما می توانید ImagePNG Function ImageJPEG را جایگزین کنید تا یک تصویر را در فرمت JPEG ایجاد کنید (فراموش نکنید که پارامتر عملکرد هدر را در هدر تغییر دهید (نوع محتوا: تصویر / JPEG).
  • در زیر ما خواهیم دید که تصویر تولید شده را می توان ذخیره کرد

II) توابع نقاشی تصویر

ابتدا باید بدانید که هر نقاشی با مفهوم مختصات مرتبط است، بنابراین در این پاراگراف کوچک مقاله ما برخی از ایده ها را در مورد این موضوع ارائه خواهیم داد.
گوشه بالا سمت چپ تصویر مختصات (x \u003d 0، y \u003d 0)، و سمت راست پایین (x \u003d عرض تصویر، y \u003d ارتفاع تصویر).

به عنوان مثال، برای یک تصویر با وضوح 100 در هر 200 پیکسل، مختصات خواهد بود:

ویژگی های مختلف طراحی تصویر به عنوان پارامترهای مختصات آن گرفته شده است. آنها را در سفارش دلخواه منتقل کنید. به عنوان مثال، به منظور رسم یک مستطیل، لازم است که مختصات دو نقطه عملکرد مربوطه (ImageRectangle) را انتقال دهیم. مختصات نقطه اول مربوط به گوشه سمت چپ بالای تصویر است، مختصات نقطه دوم مربوط به گوشه پایین سمت راست است. استدلال را اشتباه نگیرید، زیرا برخی از توابع می توانند نتایج اشتباه را منتشر کنند.


در اینجا یک لیست از توابع لازم برای طراحی اشکال مختلف، و همچنین برای قرار دادن متن در تصویر ایجاد شده است.
برای هر تابع شما یک توصیف مختصر از نحو و مقصد پیدا خواهید کرد.
ما قصد نداریم نمونه ای از استفاده از هر تابع را به ارمغان بیاوریم، در اینجا شما فقط یک توضیح مختصر پیدا خواهید کرد. جدول همچنین نسخه کتابخانه را مشخص می کند، که از آن پشتیبانی می شود، از آن پشتیبانی می شود. نمونه هایی از استفاده از برخی از توابع را می توان در بخش کتابچه راهنمای رسمی اختصاص داده شده به

مثال نحو

شرح

یک بوم خالی (256 رنگ) $ im $ billur ارتفاع و عرض Hauteur $ را ایجاد می کند. (فرمت PNG ترجیح داده می شود)

این ویژگی شبیه به تصویر برداری است، اما عمق رنگ تصویر به 256 رنگ محدود نمی شود. (فرمت JPEG ترجیح داده می شود)

آن را در مکان های متغیر $ COL COL که $ Rouge، $ VERT، $ BLEU (محدوده 0 .. 255) قرار دارد. برای جزئیات بیشتر، در قسمت اول ببینید.

یک بیضی را بر روی یک تصویر از $ IM با یک مرکز در یک نقطه ($ x، $ y)، $ l گسترده، $ h بالا و $ col col ایجاد می کند.

Imagellipse یکسان، اما بیضی با $ COL پر شده است

یک مستطیل رنگی $ COL را بر روی یک تصویر ایجاد می کند، بین یک نقطه با مختصات ($ x، $ y) و زاویه پایین تر از رنگ $ col

قرعه کشی یک رنگ خط $ col، که بین دو نقطه با مختصات ($ x1، $ y1) و ($ x2، $ y2) عبور می کند

تصویر $ IM چند ضلعی را رنگ می کند که مختصات آنها در آرایه $ امتیاز ($ امتیاز \u003d $ x0، $ امتیاز \u003d $ y0، $ امتیاز \u003d $ x1، $ امتیاز \u003d $ y1، و غیره)، $ num_points - مقدار $ نقاط در آرایه، $ col - رنگ.

ImagePolyGo یکسان است، اما بیضی با $ COL پر شده است

تصویر $ IM یک مستطیل را مستطیل می کند، گوشه سمت چپ بالای آن مختصات ($ x0، $ y0) و پایین تر پایین تر ($ x1، y1 $) است. $ COL - رنگ مستطیل

Imagerectangle یکسان، اما بیضی با $ COL پر شده است

این توابع به شما اجازه می دهد سبک خطوط استاتیک را تغییر دهید. برای اطلاعات بیشتر، مستندات رسمی را ببینید، به خصوص توجه به استفاده از تابع ImageStyleStyle، که همچنین برای عملکرد عکس ها نشان داده شده است.

در تصویر $ IM یک نقطه را با مختصات ($ x، $ y) و $ col رنگ می کند

ضخامت خطوط ایجاد شده توسط توابع مختلف را تغییر می دهد.

در یک تصویر، $ IM یک خط chaine را با مختصات (گوشه سمت چپ) ($ x، $ y) ایجاد می کند ($ x، $ y) $ col $ colors police - اندازه (هدست) فونت (از 0 تا 5)

یکپارچه سازی یکپارچه، اما رشته به صورت عمودی نمایش داده می شود

III) مثال اول است: سایت آمار بازدید از آمار در قالب یک نمودار

برای اعمال دانش به دست آمده در عمل - یک مثال اسکریپت ساده ایجاد کنید. اغلب لازم است آمار بازدید از سایت را در قالب هیستوگرام ارائه دهیم

ما فرض می کنیم که شما قبلا بخشی از اسکریپت را ایجاد کرده اید که مسئول حسابداری برای بازدید کنندگان است (احتمالا با استفاده از جدول MySQL). ما در مورد اجرای او در اینجا صحبت نخواهیم کرد، این هدف این مقاله نیست. فرض کنید که آمار بازدید برای هر ماه در یک آرایه از بازدید $ قرار می گیرد. در این مقاله، ما آرایه را "به صورت دستی" پر می کنیم، اما شما می توانید خودتان را با استفاده از داده های جدول MySQL خود انجام دهید.

الف) آمار بازدید: ایجاد یک تصویر و رنگ

بیایید با ایجاد یک آرایه که شامل آمار بازدید از سایت برای 12 ماه (12 عنصر) است، شروع کنیم. سپس ما یک تصویر با وضوح 400x300 تولید می کنیم و سه رنگ را ایجاد می کنیم، یکی از آنها (سفید) رنگ پس زمینه خواهد بود.

visites.php

$ بازدید \u003d آرایه (138، 254، 381، 652، 896، 720، 140، 556، 663، 331، 407، 768)؛

سربرگ ("نوع نوع: تصویر / PNG")؛
$ barcurimage \u003d 400؛
$ heuteurimage \u003d 300؛
$ IM \u003d ImageCreate ($ BarcurImage، $ HauteurImage)
یا مرگ ( "خطا هنگام ایجاد یک تصویر");

$ noir \u003d imagecolorallocate ($ im، 0، 0، 0)؛
$ bleu \u003d imagecolorallocate ($ im، 0، 0، 255)؛
?>

ب) محور نمودار را بکشید

قرار دادن محور افقی زمان (خط سیاه ساده) به قسمت پایین تصویر، ترک میدان در 10 پیکسل.

در پایین، ما تعداد هر یک از 12 ماه را با استفاده از چرخه و عملکرد Imagestring امضا می کنیم. اعداد هر 30 پیکسل واقع شده اند، از سمت چپ تصویر شروع می شوند.

سرانجام، ما خط عمودی، محور آمار ارشد بازدید از بازدید ها را صرف می کنیم.

// نگه داشتن یک خط افقی، محور Abscissa (زمان)
Imageline ($ im، 10، $ hauteurImage-10، $ billurimage-10، $ hauteurImage-10، $ noir)؛
// تعداد توالی هر یک از 12 ماه را برداشت
برای ($ mois \u003d 1؛ $ mois Imagestring ($ im، 0، $ mois * 30، $ hauteurImage-10، $ mois، $ noir)؛
}

// ما یک خط عمودی را به محور Ordinate (تعداد بازدیدکنندگان) انجام می دهیم
Imageline ($ im، 10، 10، 10، $ haïuriage-10، $ noir)؛
?>

ج) قرعه کشی چوب

در حال حاضر به یک کار پیچیده تر بروید - کشیدن چوب.

اولا، ما باید حداکثر تعداد بازدیدکنندگان را که در برنامه ارائه می کنیم، پیدا کنیم. در اینجا ما مقدار تصادفی را انتخاب کرده ایم - 1000، اما در واقع، احتمالا شما باید آن را محاسبه کنید، یک درخواست برای حداکثر مقدار ستون جدول MySQL خود را انجام دهید. ما آن را آسان تر ...

برای هر ماه، لازم است که ارتفاع مستطیل ایجاد شده را محاسبه کنید. برای انجام این کار، این معادله را حل می کند، دانستن اینکه ارتفاع مستطیل (چوب) برای حداکثر تعداد بازدید ها برابر با ارتفاع کل تصویر خواهد بود. بر اساس تعداد بازدید ها برای یک ماه خاص، ارتفاع مورد نظر را دریافت می کنیم

این تنها برای کشیدن هر مستطیل، با شروع مختصات گوشه سمت چپ بالای آن و پایان دادن به پایین سمت راست، باقی می ماند.

تعداد بازدیدکنندگان را برای یک ماه بیش از هر مستطیل اضافه کنید تا هیستوگرام را بهبود ببخشید.

// حداکثر بازدید
$ visitesmax \u003d 1000؛

// قرعه کشی چوب
برای ($ mois \u003d 1؛ $ mois<= 12 ; $mois ++) {
$ heuteurimagerectangle \u003d دور (بازدید $ [$ mois - 1] * $ hauteurimage) / $ visitesmax)؛
ImageFilledRectangle ($ im، $ mois * 30 - 7، $ heuteurImage - $ heuteurimagerectangle، $ mois * 30 + 7، $ hauteurImage - 10، $ bleu)؛
Imagestring ($ im، 0، $ mois * 30 - 7، $ heuteurImage - $ hauteurimagerectangle - 10، $ بازدید کنندگان [$ mois - 1]، $ noir)؛
}

// این همه
imagePNG ($ im)؛
?>

د) و در اینجا نتیجه است!

نتیجه، البته، عالی نیست، اما باید در ذهن داشته باشید که ما موفق به انجام کاری بیشتر یا کمتر قابل ارائه با نوشتن تنها 20 خط یک کد ساده، که به خودی خود بد نیست.

هیستوگرام حضور در 12 ماه.


iv) سایر ویژگی های مفید

در اینجا مجموعه دیگری از ویژگی های مفید طراحی شده برای مدیریت پالت رنگ، و همچنین برای به دست آوردن اطلاعات مختلف تصویر است.

شرح

"این ویژگی از نام فایل fichier $ به عنوان یک پارامتر استفاده می کند و یک آرایه حاوی 4 عنصر را باز می کند: (1) $ $ عرض تصویر (PX)، (2) $ tableau ارتفاع تصویر (PX)، (3) $ نوع تصویر تابلو (SM. مستندات)، (4) $ tafleau یک رشته را باز می کند که می تواند به برچسب IMG وارد شود (عرض \u003d "1024" "ارتفاع \u003d" 768 ")"

یک منطقه تصویر از $ im، رنگ $ col شفاف می شود. برای صرفه جویی در شفافیت، از فرمت PNG استفاده کنید

کپی منطقه تصویر مستطیلی $ src_im بر روی تصویر $ dst_im. منطقه کپی محدود به مختصات نقطه زاویه بالا سمت چپ ($ src_x، $ src_y)، عرض $ src_L و ارتفاع $ src_H است. منطقه کپی شده در تصویر گیرنده در نقطه با مختصات ظاهر می شود. ($ dst_x، $ dst_y)

Imagecopy یکسان، علاوه بر این، تابع انتقال تدریجی تن از شدت های شدید $ را انجام می دهد که از 1 تا 100 ارزش دارد.

همین اثر را به عنوان Imagecopy انجام می دهد و همچنین تغییر در اندازه تصویر را تغییر می دهد. مثال زیر را ببینید

Imagecopyrempled یکسان، اما نتیجه پوسته پوسته شدن، حاکم کمتر است، اما عملکرد سریعتر کار می کند.

شناسه منبع را باز می گرداند، $ IM، نشان دهنده تصویر است که در فایل فرمت JPEG $ fichier است.

شناسه منبع را باز می گرداند، $ IM، نشان دهنده یک تصویر است که در فرمت PNG PNG $ Fichier PNG قرار دارد.

عرض تصویر $ im را باز می گرداند

ارتفاع $ im را باز می گرداند

v) مثال دوم: تولید مینیاتوری (کاهش تصاویر کپی شده)

این مثال در نظر گرفته شده است برای ایجاد یک کپی کاهش یافته از یک تصویر موجود. شما ممکن است مجبور شوید این ویژگی را در هنگام نوشتن یک گالری عکس بر روی PNP اجرا کنید، که در آن عکس ها به صورت مینیاتوری ارائه می شود و بازدید کننده می تواند بر روی آنها با کلیک بر روی ماوس برای بزرگنمایی کلیک کند. در این مثال، ما یک مینیاتوری مجهز به یک قاب و برخی از توضیحات (اندازه و نام تصویر) تولید می کنیم

الف) آغاز

بر خلاف مثال اول، این اسکریپت یک تصویر را به یک فایل ضبط می کند و آن را در پرواز تولید نمی کند. بنابراین، نیاز به ارسال یک هدر HTTP خاص با استفاده از تابع هدر () ناپدید می شود. بنابراین، اسکریپت "کلاسیک" می شود و می تواند HTML را تولید کند.

بیایید با ایجاد یک بوم خالی با اندازه 200x150 شروع کنیم، سپس تصویر موجود (از فایل) را با استفاده از تابع ImageCreateFromJPEG در نظر بگیرید. سپس ما همچنین ممکن است به اندازه تصویر منبع نیاز داشته باشیم، زیرا ما از تصاویر و تصاویر استفاده خواهیم کرد.

miniature.php.

$ fichierce \u003d "photo3.jpg"؛

$ backurdestination \u003d 200؛
$ heuteurdestination \u003d 150؛
$ IM \u003d Imagecreceecolor ($ perganuredination، $ heuteurdestination)
یا مرگ ( "خطا هنگام ایجاد یک تصویر");

$ SOURCE \u003d IMAGECREATEFROMJPEG ($ fichierce)؛

$ barcursource \u003d imagesx ($ منبع)؛
$ hauteursource \u003d imageysy ($ منبع)؛
?>

ب) قاب

پس از ایجاد چندین رنگ، قاب را قرعه کشی کنید. برای ساده کردن این کار، از سایه های مختلف خاکستری استفاده خواهیم کرد.

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

ضخامت قاب ساخته شده توسط ما 8 پیکسل است.

$ blanc \u003d imagecolorallocate ($ im، 255، 255، 255)؛
$ gris [0] \u003d imagecolorallocate ($ im، 90، 90، 90)؛
$ gris [1] \u003d imagecolorallocate ($ im، 110، 110، 110)؛
$ gris [2] \u003d imagecolorallocate ($ im، 130، 130، 130)؛
$ gris [3] \u003d imagecolorallocate ($ im، 150، 150، 150)؛
$ gris [4] \u003d imagecolorallocate ($ im، 170، 170، 170)؛
$ gris [5] \u003d imagecolorallocate ($ im، 190، 190، 190، 190)؛
$ gris [6] \u003d imagecolorallocate ($ im، 210، 210، 210)؛
$ gris [7] \u003d imagecolorallocate ($ im، 230، 230، 230)؛

برای ($ I \u003d 0؛ $ I<= 7 ; $i ++) {
imageFilledRectangle ($ im، $ i، $ i، $ pregalurdination - $ i، $ heuteurdestination - $ i، $ gris [$ i])؛
}
?>

ج) ایجاد مینیاتوری

برای ایجاد ریز عکسها، ویژگی ImageCopyResampled استفاده می شود. این یک تصویر را به دیگری کپی می کند، می تواند اندازه منطقه کپی شده را تغییر دهد. این تابع پارامترهای متعددی را می گیرد که ارزش آن واضح است. ما آنها را به ترتیب فهرست می کنیم:

  • ($ im im) گیرنده تصویر
  • (منبع $ منبع) منبع تصویر
  • مختصات تصویر تصویر گیرنده که تصویر آن را تحت تاثیر قرار می دهد.
  • هماهنگی Y.
  • هماهنگی X کپی تصویر تصویر (0 اگر ما می خواهیم کل تصویر را کپی کنیم)
  • مختصات (Y)
  • عرض کپی، که به تصویر منبع وارد می شود ($ pergoruredination- (2 * 8) عرض تصویر گیرنده منهای عرض قاب در سمت راست و چپ).
  • ارتفاع کپی (ما عملیات مشابه را با عرض یکسان انجام می دهیم)
  • عرض منطقه تصویر کپی
  • ، $ hauteursource)؛
    Imagestring ($ im، 0، 12، $ heuteurdestination - 18، "$ fichierce - ($ barcursource x $ heuteursource)، $ blanc)؛
    ?>

    د) صرفه جویی در نتیجه.

    ما فقط می توانیم نتیجه را در فایل ذخیره کنیم، نام آن با mini_ شروع می شود. این کار را با تابع ImageJPEG انجام خواهیم داد.
    هنگامی که این ویژگی تنها یک پارامتر دارد، تصویر در مرورگر کاربر نمایش داده می شود. با این حال، اگر نام فایل به عنوان پارامتر دوم منتقل شود، به مرورگر منتقل نخواهد شد و تصویر در فایل مشخص شده ذخیره خواهد شد. همان قانون برای تابع imagepng معتبر است

    تصویر من نمایش داده نمی شود، مرورگر رفتار می کند به طوری که اگر آن وجود ندارد.
    به احتمال زیاد، خطا باید در اسکریپت شما امضا شود. یک نظر را از رشته هدر ("نوع محتوا: تصویر / PNG") (یا هدر ("نوع محتوا: تصویر / JPEG))، و همچنین از رشته imagePNG ($ im) (orimagejpeg ($ im) )) برای دریافت یک پیام خطا

    اسکریپت طولانی بر روی میزبانی من انجام می شود، آیا طبیعی است؟
    اگر از توابع "سنگین" به عنوان ImageCopyResamPled استفاده می کنید، تعجب آور نیست. مترجم پی اچ پی، نصب شده در میزبانی، و بدون این کار کافی است ...

    رنگ تصویر من تحریف شده است (یا به عنوان سیاه و سفید نمایش داده می شود)، چرا؟
    به احتمال زیاد شما از ویژگی ImageCreate استفاده کردید که پالت رنگ 256 رنگ را محدود می کند. برای غلبه بر این محدودیت، استفاده از تابع ImageCreateTusolor به جای ImageCreate.

    پایان دادن به این مقاله، ما نشان می دهیم که نتیجه می تواند با ترکیب دو نمونه از این مقاله به دست آید. در اینجا، ما Halftone را به هیستوگرام اضافه کردیم با استفاده از روش مشابه به عنوان مثال 2.

    نتیجه


در این مقاله، ما جزئیات مکانیسم بارگذاری تصاویر را به سرور با استفاده از PHP بدون استفاده از اجزای شخص ثالث و چارچوب ها توصیف خواهیم کرد. ما یاد خواهیم گرفت که تصاویر را نه تنها از دستگاه کاربر محلی، بلکه فایل های راه دور را با مرجع بارگذاری کنیم. تمام نمونه هایی از کد من در یک سبک رویه ای نوشتم، به منظور خواندن کد سریعتر، و از یک روش به دیگری پرش نکنید. دستی به طور کامل کپی رایت و ادعا نمی کند هیچ علمی ارائه.

§ اصول کلی

کل دنباله ای از بارگذاری تصویر به سرور می تواند به صورت زیر نمایش داده شود: راه اندازی php.iniدریافت فایلبازرسی امنیتیاعتبار سنجی داده هاصرفه جویی در دیسک. فرآیند بارگذاری یک تصویر از رایانه رایانه یا URL ها متفاوت نیستند، به جز روش به دست آوردن یک تصویر و صرفه جویی آن. طرح بارگذاری عمومی تصویر بر روی سرور به شرح زیر است:

برای تأیید تصویر بر روی URL، ما از GetImagesizeFromString () از تابع استفاده خواهیم کرد، زیرا Curl آن را به یک متغیر برای دستکاری های بیشتر منتقل می کند.

همانطور که تصاویر را به سرور بارگذاری می کنیم، پارامترهای خاصی را بررسی می کنیم: عرض, ارتفاع, یک نوع تصاویر، اندازه فایل در بایت این بستگی به منطق برنامه شما بستگی دارد، اما برای وضوح در این کتابچه راهنمای کاربر، تمام پارامترهای فوق را که در بالا توضیح داده شده را بررسی خواهیم کرد.

§2 مقررات ایمنی

ایمنی بارگذاری تصویر برای جلوگیری از کد بیگانه به سرور و اعدام آن کاهش می یابد. در عمل، بارگیری تصاویر آسیب پذیر ترین مکان در برنامه های PHP: اسکریپت پوسته, یک کد مخرب در فایل های دودویی خواهد بود, امضای اطلاعات EXIF. به منظور اجتناب از بسیاری از روش های هک، شما باید قوانین زیر را دنبال کنید:

ولی نه اطلاعات اعتماد از $ _files؛
ب نه نوع MIME از تصاویر از عملکرد GetImagesize () را بررسی کنید؛
در فایل قابل دانلود، یک نام و گسترش جدید ایجاد کنید؛
g ممنوعیت اجرای اسکریپت های پی اچ پی در پوشه تصویر؛
d. نه داده های کاربر را از طریق نیاز به وارد کردن داده و شامل؛
e برای $ _FILES استفاده از IS_UPLOADED_FILE () و MOVE_UPLOADED_FILE ().

اگر چیزی برای اضافه کردن "قوانین امنیتی" وجود دارد، نظرات و یا مراجع خود را به مقالات ایمنی در نظرات این راهنما ارسال کنید، و من آنها را در این پاراگراف منتشر می کنم.

§3 پیکربندی php.ini

پی اچ پی به شما امکان می دهد تا مقادیر پیکربندی خاصی را در فرآیند دانلود هر فایل انجام دهید. برای انجام این کار، در فایل php.ini برای پیدا کردن بلوک ها ضروری است " محدودیت منابع», « داده گردانی"و" آپلود فایل"، و سپس ویرایش، در صورت لزوم، مقادیر زیر:

؛ حداکثر زمان اجرای اسکریپت در ثانیه max_execution_time \u003d 60 ؛ حداکثر مصرف حافظه با یک اسکریپت memory_limit \u003d 64 متر ؛ حداکثر اندازه مجاز داده های ارسال شده توسط روش پست post_max_size \u003d 5m. ؛ اجازه دانلود فایل ها file_uploads \u003d روشن ؛ پوشه برای ذخیره فایل ها در هنگام دانلود upload_tmp_dir \u003d صفحه اصلی / کاربر / temp ؛ حداکثر اندازه فایل دانلود شده upload_max_filesize \u003d 5m. ؛ حداکثر تعداد مجاز از فایل های قابل دانلود به طور همزمان max_file_uploads \u003d 10.

بر اساس مقادیر مشخص شده، کاربر قادر نخواهد بود بیش از ده فایل را در یک بار آپلود کند و هر فایل نباید بیش از 5 مگابایت باشد. پارامترهای بلوک " محدودیت منابع»ما بیشتر مورد نیاز برای دانلود یک فایل از راه دور، از زمان با Curl، ما محتویات را به متغیر دانلود می کنیم و آن را بر روی معیارهای مورد نیاز بررسی خواهیم کرد و برای این کار نیاز به زمان و حافظه اضافی دارید.

فایل پیکربندی php.ini همیشه برای پیکربندی با توجه به منطق کسب و کار برنامه وب مورد نیاز است. به عنوان مثال، ما قصد داریم بیش از ده فایل را تا 5 مگابایت آپلود کنیم، به این معنی که ما باید مورد نیاز ~ 50 مگابایت حافظه باشد. علاوه بر این، ما باید حداکثر زمان بارگیری یک فایل از دستگاه محلی را بدانیم و در لینک برای تنظیم زمان اجرای کافی از اسکریپت در max_execution_time تنظیم کنیم و خطاهای کاربران را ترساند.

§فور بارگیری تصاویر از فرم

در حال حاضر ما دانلود فایل های متعدد را به سرور در نظر نمی گیریم، و ما تنها مکانیک دانلود خود را در مثال یک فایل تجزیه و تحلیل خواهیم کرد. بنابراین، برای بارگیری یک عکس از کامپیوتر کامپیوتر، باید از فرم HTML برای ارسال فایل اسکریپت PHP با استفاده از روش POST استفاده کنید و روش رمزگذاری داده را مشخص کنید encype \u003d "multipart / فرم داده" (در این مورد، داده ها رمزگذاری نشده اند و این مقدار فقط برای ارسال فایل های باینری اعمال می شود). با فرم زیر ما بیشتر کار خواهیم کرد:

برای فیلد انتخاب فایل، ما از نام استفاده می کنیم. نام \u003d "آپلود" در فرم HTML ما، هرچند که می تواند باشد. پس از ارسال فایل PHP فایل PHP-handler.php می توان آن را با استفاده از یک متغیر superglobal متوقف کرد $ _FILES ["آپلود"] با همان نامی که در آرایه حاوی اطلاعات فایل است:

آرایه ( \u003d\u003e picture.jpg. // نام فایل اصلی \u003d\u003e Image / JPEG // نوع فایل MIME \u003d\u003e صفحه اصلی \\ user \\ temp \\ phpd07e.tmp // فایل باینری \u003d\u003e 0 // کد خطا => 17170 // اندازه فایل در بایت)

همه داده ها از $ _FILES. شما می توانید اعتماد کنید: اندازه MIME نوع و اندازه فایل را می توان از آن جدا کرد، زیرا آنها از یک پاسخ HTTP تشکیل می شوند و پسوند در نام فایل نباید به دلیل این واقعیت که یک فایل کاملا متفاوت ممکن است پنهان شود، مورد اعتماد قرار گیرد. با این حال، بیشتر، ما باید بررسی کنیم که آیا فایل ما به درستی بارگذاری می شود و اینکه آیا آن را بوت می کند. برای انجام این کار، اشتباهات را بررسی کنید $ _FILES ["آپلود"] ["خطا"] و اطمینان حاصل کنید که فایل با استفاده از تابع بارگذاری شده است is_uploaded_file (). اگر چیزی در طرح نیست، به این معنی است که ما خطا را بر روی صفحه نمایش می گیریم.

// متغیرها را برای راحتی بازنویسی کنید $ filePath \u003d $ _files ["آپلود"] ["tmp_name"]؛ $ ERRORCODE \u003d $ _FILES ["آپلود"] ["خطا"]؛ // بررسی خطاها اگر ($ errorcode! \u003d\u003d upload_err_ok || is_uploaded_file ($ firepath)) ( // آرایه با نام خطا $ errormessages \u003d [upload_err_ini_size \u003d\u003e "اندازه فایل بیش از مقدار update_max_filesize بیش از مقدار پیکربندی PHP است."، upload_err_form_size \u003d\u003e "اندازه فایل دانلود شده بیش از مقدار max_file_size در فرم HTML بیش از حد است."، upload_err_partial \u003d\u003e "فایل دانلود فقط تا حدی به دست آمد."، upload_err_no_file \u003d\u003e "فایل بارگیری نشد."، upload_err_no_tmp_dir \u003d\u003e "هیچ پوشه موقت وجود ندارد."، upload_err_cant_write \u003d\u003e "ضبط یک فایل به دیسک ضبط نشد."، upload_err_extension \u003d\u003e "فرمت پی اچ پی متوقف شد دانلود یک فایل.", ]; // خطای ناشناخته را تنظیم کنید $ unknownMessage \u003d. هنگام دانلود فایل، یک خطای ناشناخته رخ داد. "; // اگر هیچ کد خطا در آرایه وجود ندارد، بگذارید بگوییم یک خطا ناشناخته است $ outputMessage \u003d isset ($ errormessages [$ errorcode])؟ $ errormessages [$ errorcode]: $ unknownMessage؛ // نام خطا را بردارید Die ($ outpectMessage)؛ )

به منظور مهاجم کد مخرب را که به تصویر ساخته نشده است بارگیری نشده است، نمی توانید به توابع اعتماد کنید getimagesize ()که همچنین نوع MIME را باز می گرداند. این تابع انتظار می رود اولین استدلال به اشاره به فایل تصویر صحیح. شما می توانید یک نوع تصویر MIME واقعی را از طریق فرمت fileinfo تعریف کنید. کد زیر حضور یک کلمه کلیدی را بررسی می کند تصویر در نوع فایل قابل دانلود ما و اگر آن را خاموش نمی شود، خطا را ارائه می دهد:

// ایجاد یک منبع fileinfo $ fi \u003d finfo_open (fileinfo_mime_type)؛ // ما نوع MIME $ MIME \u003d (رشته) finfo_file ($ fi، $ firepath) را دریافت می کنیم؛ )

در این مرحله، ما می توانیم به طور کامل هر عکس را در سرور ما آپلود کنیم که در نوع MIME بررسی شده است، اما برای بارگذاری تصاویر بر ویژگی های خاص، ما باید آنها را با استفاده از تابع تأیید کنیم getimagesize ()که ممکن است یک فایل باینری باشد $ _files ["آپلود"] ["tmp_name"]. در نتیجه، ما مجموعه ای از 7 عنصر را به دست می آوریم:

آرایه (\u003d\u003e 1280 // width \u003d\u003e 768 // ارتفاع \u003d\u003e 2 // نوع \u003d\u003e width \u003d "1280" ارتفاع \u003d "768" // ویژگی های HTML \u003d\u003e 8 // عمق رنگ => 3 // مدل رنگ \u003d\u003e تصویر / JPEG // نوع MIME)

برای اعتبار بیشتر تصویر و کار بر روی آن، ما باید تنها 3 ارزش را بدانیم: عرض, ارتفاع و اندازه فایل (برای محاسبه اندازه عملکرد اعمال می شود حجم فایل () برای یک فایل باینری از یک پوشه موقت).

// تابع نتیجه در یک متغیر نوشتن $ image \u003d getimagesize ($ firepath)؛ $ limitbytes \u003d 1024 * 1024 * 5؛ $ limitWidth \u003d 1280؛ $ LimiteRight \u003d 768؛ // پارامترهای مورد نظر را بررسی کنید اگر (scileize ($ firepath)\u003e $ limitbytes) مرگ ( "اندازه تصویر نباید بیش از 5 مگابایت باشد.") اگر ($ image\u003e $ limitightight) die ()؛ اگر ($ image\u003e $ limitWidth) die ()؛

پس از تمام چک ها، ما می توانیم با اعتماد به نفس به انتقال فایل قابل دانلود ما به برخی از پوشه تصاویر. از طریق عملکرد بهتر عمل کنید move_uploaded_file ()که در حالت ایمن کار می کند. قبل از انتقال فایل، نمی توانید فراموش کنید یک نام تصادفی و گسترش را از نوع تصویر ایجاد کنید برای فایل ما به نظر می رسد:

// یک نام فایل جدید را بر اساس MD5-Hash تولید کنید $ name \u003d md5_file ($ firepath)؛ // socil .jpeg قبل از .jpg// تصویر را با نام جدید و فرمت به پوشه / عکس انتقال دهید اگر (! move_uploaded_file ($ firepath، __DIR__ "/ PICS /". $ نام $ فرمت)) (DIE ( "هنگام نوشتن یک تصویر خطایی رخ داد."); }

این در این مورد تکمیل شده است. برای دریافت راحت تر از فایل ها، شما می توانید از کلاس uploadedFile از بسته Symfony HttpFoundation استفاده کنید، که یک بسته بندی شده است $ _FILES. و همچنین فایل را از طریق ذخیره می کند move_uploaded_file ().

§fivefive بارگیری تصویر با مرجع

برای دانلود تصویر با مرجع، ما نیاز به یک کتابخانه Curl داریم که با منابع از راه دور کار می کند. با آن، ما محتوا را در متغیر دانلود خواهیم کرد. از یک طرف، ممکن است به نظر برسد که برای این اهداف آن خواهد بود file_get_contents ()اما در واقع ما قادر به کنترل حجم داده های قابل دانلود نخواهیم بود و به طور معمول تمام خطاها را پردازش می کنیم. به منظور CURL به درستی اطلاعات مورد نیاز ما را دانلود کنید: اجازه دهید به دنبال تغییر مسیرچک کردن را فعال کنید گواهی نامهنقطه حداکثر زمان Curl Works (به دلیل حجم داده های قابل دانلود و سرعت متوسط \u200b\u200bبا یک منبع) تشکیل شده است. چگونه فایل را به متغیر نشان داده شده در زیر با پارامترهای لازم دانلود کنید:

// به نوعی ما یک لینک دریافت می کنیم $ url \u003d "https://site.ru/picture.jpg"؛ // http را در آدرس لینک بررسی کنید اگر (! preg_match ("/ ^ https ؟: / i"، $ url) && filter_var ($ URL، filter_validate_url)) (Die ( "پیوند صحیح را به فایل از راه دور مشخص کنید."); } // شروع به پیچیدگی با مرجع ما $ ch \u003d curl_init (url $)؛ // تنظیمات را برای CURL مشخص کنید curl_setopt_array ($ ch، [ // حداکثر ساعت کاری را مشخص کنید curlopt_timeout \u003d\u003e 60، // اجازه رفتن به دنبال تغییر مسیر curlopt_followlocation \u003d\u003e 1، // اجازه می دهد که نتیجه را در یک متغیر بنویسید curlopt_returntransfer \u003d\u003e 1، // نشانگر بار داده را روشن کنید curlopt_noprogress \u003d\u003e 0، // رنگ بافر اندازه 1 کیلوبایت را رنگ کنید curlopt_buffersize \u003d\u003e 1024، // یک ویژگی برای شمارش داده های دانلود شده را بنویسید // ادامه مطلب: http://stackoverflow.com/a/17642638 curlopt_progressfunction \u003d\u003e عملکرد ($ ch، $ dwnldsize، $ dwnld، $ uplddsize، $ upld) ( // هنگامی که آن را بیش از 5 مگابایت دانلود می شود، Curl کار را قطع می کند اگر ($ dwnld\u003e 1024 * 1024 * 5) (بازگشت - 1؛))، // چک گواهی را روشن کنید (به طور پیش فرض) curlopt_ssl_verifypeer \u003d\u003e 1، // نام گواهی و تصادف آن را با میزبان مشخص شده بررسی کنید (به طور پیش فرض) curlopt_ssl_verifyhost \u003d\u003e 2، // گواهی تأیید را مشخص کنید // دانلود: https://curl.haxx.se/docs/caextract.html curlopt_cainfo \u003d\u003e __dir__. "/cacert.pem"،])؛ $ raw \u003d curl_exec ($ ch)؛ // اطلاعات را به متغیر دانلود کنید $ info \u003d curl_getinfo ($ ch)؛ // ما اطلاعاتی در مورد عملیات دریافت می کنیم $ ERROR \u003d CURL_ERRNO ($ ch)؛ // کد آخرین خطای را بنویسید // جلسه کامل curl curl_close ($ ch)؛

اگر همه چیز با موفقیت انجام شود و Curl در 60 ثانیه ملاقات کرد، مطالب در لینک به متغیر دانلود می شود $ RAW. علاوه بر این، عملکرد curl_getinfo () اطلاعات مربوط به درخواست درخواست شده را بازگردانید، از جایی که می توانیم اطلاعات بیشتری برای تجزیه و تحلیل کار با منابع از راه دور دریافت کنیم:

آرایه ( \u003d\u003e تصویر / JPEG // نوع MIME از نوع محتوا => 200 // آخرین کد HTTP => 0 // تعداد تغییر مسیر => 0.656 // کل زمان پیچ خورده => 0.188 // زمان برای اتصال با میزبان => 4504 // اندازه واقعی داده ها => 4504 // اندازه داده از حد محتوا /* ... */ )

بعد، ما باید بررسی کنیم که آیا اشتباهات وجود ندارد curl_errno () و اطمینان حاصل کنید که منابع کد HTTP برابر 200 را به دست می آورند، در غیر اینصورت ما می توانیم بگوییم که این برای چنین URL یافت نشد. پس از همه بررسی متغیر $ RAW انتقال B. getImagestring () و ما در حال حاضر در طرح اگزوز به عنوان در مورد بارگیری تصاویر از فرم کار می کنیم.

لطفا توجه داشته باشید که ما اندازه فایل را در زمان دریافت اطلاعات به دست آوریم، از آنجا که ما نمی توانیم Curl_getInfo () را باور کنیم، از آنجا که content_type، http_code مقادیر http_code، download_content_length بر اساس سرفصل های HTTP دریافت شده است. فایل را به طور کامل دانلود کنید، سپس تعداد بایت ها را بررسی کنید، زمان و حافظه زیادی نیاز دارید. بنابراین، ما اندازه داده های به دست آمده را با استفاده از گزینه Curlopt_ProgRessFunction کنترل کردیم: به محض اینکه Curl اطلاعات بیشتری نسبت به حد ما می گیرد، کار را متوقف می کند و خطای Curle_aborted_bay_callback را می دهد.

// خطاهای پیچ و مهره و دسترسی به فایل را بررسی کنید اگر ($ خطا \u003d\u003d\u003d curle_operation_timedout) مرگ ( "محدودیت انتظار بیش از حد است.") اگر ($ ERROR \u003d\u003d\u003d CURLE_ABORTED_BY_CALLBACKBACK) DIE ( "اندازه نباید بیش از 5 مگابایت باشد.") اگر ($ info ["http_code"]! \u003d\u003d 200) مرگ ( "فایل در دسترس نیست."); // ایجاد یک منبع fileinfo $ fi \u003d finfo_open (fileinfo_mime_type)؛ // دریافت نوع MIME با استفاده از محتویات $ RAW $ mime \u003d (رشته) finfo_buffer ($ fi، $ raw)؛ // منابع fileinfo را ببندید finfo_close ($ fi)؛ // تصویر کلمه کلیدی را بررسی کنید (تصویر / JPEG، تصویر / PNG، و غیره) اگر (strs ($ mime، "تصویر") \u003d\u003d\u003d FALSE) DIE ( "شما فقط می توانید تصاویر را دانلود کنید."); // اطلاعات تصویر را از محتویات آن بردارید. $ image \u003d getimagesizefromString ($ raw)؛ // محدودیت ها را برای تصاویر تنظیم کنید $ limitWidth \u003d 1280؛ $ LimiteRight \u003d 768؛ // پارامترهای مورد نظر را بررسی کنید اگر ($ image\u003e $ limitightight) مرگ ( "ارتفاع تصویر نباید بیش از 768 امتیاز باشد.") اگر ($ image\u003e $ limitWidth) مرگ ( "عرض تصویر نباید بیش از 1280 امتیاز باشد."); // یک نام جدید را از تصویر MD5-Hash تولید کنید $ نام \u003d MD5 ($ RAW)؛ // تولید فرمت فایل بر اساس نوع تصویر $ extension \u003d image_type_to_extension ($ image)؛ // socil .jpeg قبل از .jpg $ format \u003d str_replace ("jpeg"، "jpg"، $ extension)؛ // تصویر را با نام جدید و فرمت به پوشه / عکس ذخیره کنید اگر (file_put_contents (__dir__. "/ عکس /". $ نام $ فرمت، $ RAW)) (Die ( "هنگام ذخیره یک تصویر خطایی رخ داد."); }

شما می توانید از تصویر برای ذخیره استفاده کنید file_put_contents ()که محتوا را به فایل ثبت می کند. نام فایل جدید ما از طریق تابع ایجاد می کنیم mD5 ()و فرمت از طریق image_type_to_extension (). حالا ما می توانیم هر عکس را در لینک آپلود کنیم.

§6 راه اندازی یک مجموعه چند فایل

در این بخش، روش های دانلود چندین عکس را در یک بار از دستگاه کاربر محلی و در لینک های راه دور تجزیه و تحلیل خواهیم کرد. ما از لینک ها برای ارسال لینک ها استفاده می کنیم $ _post. و اجازه دهید ما آن را تمام داده ها با استفاده از برچسب textarea. برای دانلود فایل ها از فرم، ما همچنان به کار ادامه خواهیم داد $ _FILES.. فرم HTML جدید ما کمی متفاوت از قدیمی است.

در انتهای نام فیلد انتخاب فایل نام \u003d "آپلود" پرانتز فکری و ویژگی اضافه شده است چندگانهکه اجازه می دهد تا مرورگر چندین فایل را انتخاب کند. اگر هیچ خطایی در php.ini وجود نداشته باشد، تمام فایل ها دوباره در یک پوشه موقت بارگیری می شوند. شما می توانید آنها را درگیر کنید $ _FILES.اما این بار متغیر superglice یک ساختار ناراحت کننده برای پردازش داده ها در آرایه دارد. این وظیفه با دستکاری های کوچک با آرایه حل می شود:

// ساختار $ _Files را تغییر دهید foreach ($ _files ["upload"] به عنوان $ key \u003d\u003e $ ارزش) (foreach ($ ارزش به عنوان $ k \u003d\u003e $ v) ($ _files ["upload"] [$ k] [$ k] [$ k] \u003d $ v؛ ) // حذف کلیدهای قدیمی UNSET ($ _FILES ["آپلود"] [$ key])؛ ) // بارگیری تمام تصاویر به ترتیب foreach ($ _files ["آپلود"] به عنوان $ k \u003d\u003e $ v) ( // بارگیری یک فایل $ _FILES ["آپلود"] [$ k] ["tmp_name"]؛ $ _FILES ["آپلود"] [$ k] ["خطا"]؛ )

برای دانلود چندین عکس در URL، اجازه دهید لینک های ما را از طریق textarea با نام نام \u003d "آپلود"جایی که آنها را می توان از طریق یک فضا یا از یک خط جدید مشخص کرد. تابع preg_split فاجعه تمام داده ها را از $ _POST ["آپلود"] و این یک آرایه را تشکیل می دهد که در آن شما باید چرخه را راه بروید و هر URL معتبر به Handler ارسال کنید.

$ data \u003d preg_split ("/ / \\ s + /"، $ _POST ["آپلود"]، - 1، preg_split_no_empty)؛ foreach ($ داده به عنوان $ URL) ( // تایید و بارگذاری تصویر بر روی URL }

ایجاد یک عکس خالی

نحو:

int imageceate (int x، int y)

اندازه تصویر خالی را ایجاد می کند ایکس. در y. امتیازات و شناسه آن را باز می گرداند. پس از ایجاد تصویر، تمام کار با آن از طریق این شناسه انجام می شود، به طور مشابه با چگونگی کار ما با فایل از طریق توصیفگر آن کار می کنیم.

مثال:

ایجاد یک تصویر جدید با GD و آن را به صفحه مرورگر برداشت:

imageceatefrompng

ایجاد یک عکس از فایل PNG.

نحو:

int imageceatefompng (رشته رشته)

این تابع تصاویر را از فایل PNG به حافظه بارگذاری می کند و آن را به شناسه باز می گرداند. به عنوان پس از تماس imageCreate ()

مثال:

یک مثال از پیدا کردن یک خطا هنگام باز کردن یک فایل گرافیکی.

تابع loadpng ($ imgname) ($ im \u003d imagecreatefompng ($ imgname)؛ / * تلاش برای باز کردن * / اگر (! $ im) (/ * ببینید اگر آن را شکست خورده * / $ IM \u003d ImageCreate (150، 30)؛ / * ایجاد یک تصویر خالی * / $ bgc \u003d ImagecolorAlocate ($ im، 255، 255، 255)؛ $ tc \u003d imagecolorallocate ($ im، 0، 0، 0)؛ ImageFilledRectangle ($ im، 0، 0، 150، 30، $ BGC)؛ / * خروجی errmsg * / ImagestRing ($ im، 1، 5، 5، "خطا در بارگیری $ imgname"، $ TC)؛) بازگشت $ im؛)

imageceatefromjpeg

ایجاد یک عکس از یک فایل JPEG.

نحو:

int imageceatefromjpeg (رشته رشته)

imageCreate ()، کار بیشتر با تصویر تنها از طریق این شناسه امکان پذیر است. هنگام بوت شدن از یک دیسک، تصویر در حال حاضر در فرمت بسته بندی نشده بسته شده و ذخیره می شود، به طوری که شما می توانید عملیات های مختلفی را با آن، مانند پوسته پوسته شدن، خطوط نقاشی و غیره انجام دهید.

imageceatefromgif

ایجاد یک نقاشی از فایل GIF.

نحو:

int imageceatefromgif (رشته رشته ای)

این ویژگی تصاویر را از فایل به حافظه بارگذاری می کند و شناسه آن را باز می گرداند. به عنوان پس از تماس imageCreate ()، کار بیشتر با تصویر تنها از طریق این شناسه امکان پذیر است. هنگام بوت شدن از یک دیسک، تصویر در حال حاضر در فرمت بسته بندی نشده بسته شده و ذخیره می شود، به طوری که شما می توانید عملیات های مختلفی را با آن، مانند پوسته پوسته شدن، خطوط نقاشی و غیره انجام دهید.

لازم به ذکر است که GD شروع از نسخه 1.6 از فرمت GIF پشتیبانی نمی کند. در این رابطه، این عملکرد عملا استفاده نمی شود.

imagePng

این تابع یک تصویر را در فرمت PNG به هر مرورگر یا یک فایل نمایش می دهد.

نحو:

INT IMGEPNG (INT IM [، رشته رشته])

این ویژگی موجب صرفه جویی در تصویر مشخص شده توسط شناسه آن و در حافظه، به دیسک، و یا آن را به مرورگر.

imageCreate () من هستم..

اگر استدلال نام فایل. نوع محتوا. سرتیتر ().

سربرگ ("نوع محتوا: تصویر / PNG") برای png

مثال: یک مثال از استفاده از تابع imagePng ():

برای ذخیره تصویر منبع آلفا کانال، از تابع استفاده کنید imagesavealpha ():

imagejpeg

مرورگر JPEG تصویر را فشار دهید یا آن را در فایل ذخیره کنید.

نحو:

Int ImageJPEG (INT IM [، رشته رشته [، کیفیت INT]]

این ویژگی موجب صرفه جویی در تصویر مشخص شده توسط شناسه آن و در حافظه به دیسک، و یا آن را به مرورگر نمایش داده می شود.

البته، در ابتدا یک تصویر باید بارگیری شود یا با استفاده از یک تابع ایجاد شود. imageCreate (). ما باید شناسه خود را بدانیم من هستم..

اگر استدلال نام فایل. حذف شده، سپس داده های فشرده شده در فرمت مناسب به طور مستقیم به جریان خروجی استاندارد نمایش داده می شود، I.E. در مرورگر عنوان دلخواه نوع محتوا. این نمایش داده نمی شود، با توجه به آن شما باید آن را به صورت دستی استفاده کنید سرتیتر ().

در حقیقت، شما باید یکی از سه دستورات را با توجه به نوع تصویر تماس بگیرید:

سربرگ ("نوع نوع: تصویر / JPEG) برای JPEG

سوم پارامتر اختیاری کیفیت کیفیت تصویر را (از 0 تا 100) تنظیم می کند.

image2wbmp

نمایش تصویر به یک مرورگر یا فایل.

نحو:

int image2wbmp (تصویر منبع [، رشته رشته [، threshold int]])

تابع یک تصویر مشخص شده توسط توصیفگر را نمایش می دهد تصویر، در مرورگر، یا به یک فایل که نام آن توسط یک پارامتر اختیاری تنظیم می شود نام فایل..

اگر تصویر در مرورگر نمایش داده شود، باید نوع WBMP را به عنوان ویژگی تصویر / vnd.wap.wbmp مشخص کنید سرتیتر ():

تابع image2wbmp () در دسترس پی اچ پی فقط اگر نسخه کتابخانه GD 1.8 یا پایین تر.

imageGif

ارسال یک تصویر از مرورگر GIF یا ذخیره آن در فایل.

نحو:

int imageGif (INT IM [، رشته رشته])

این تابع تصویر را مشخص شده توسط شناسه آن و حافظه به دیسک ذخیره می کند یا آن را به مرورگر منتقل می کند.

البته، در ابتدا یک تصویر باید بارگیری شود یا با استفاده از یک تابع ایجاد شود. imageCreate (). ما باید شناسه خود را بدانیم من هستم..

اگر استدلال نام فایل. حذف شده، سپس داده های فشرده شده در فرمت مناسب به طور مستقیم به جریان خروجی استاندارد نمایش داده می شود، I.E. در مرورگر عنوان دلخواه نوع محتوا. این نمایش داده نمی شود، با توجه به آن شما باید آن را به صورت دستی استفاده کنید سرتیتر ().

در حقیقت، شما باید یکی از سه دستورات را با توجه به نوع تصویر تماس بگیرید:

سربرگ ("نوع محتوا: تصویر / GIF")

زیرا کتابخانه GDشروع با نسخه 1.6، از فرمت GIF پشتیبانی نمی کند، این تابع به ندرت مورد استفاده قرار می گیرد.

تحریک کننده

کپی کردن بخشی از الگو.

نحو:

int imagecopy (int dst_im، int src_im، int dst_x، int dst_y، int src_x، int src_y، int src_w، int src_h)

این تابع منطقه مستطیلی را از نقطه نظر کپی می کند ( src_x., src_y) عرض src_w و ارتفاع src_h از نقاشی src_im در نقاشی dst_im، دادن یک منطقه افست کپی شده ( dst_x, dst_y).

مثال زیر تصویر خواهد بود file1.png به طور کامل توسط B کپی شده است file2.png

تصویربرداری

کپی کردن یک قطعه الگوی با پوسته پوسته شدن.

نحو:

int imagecopyresized (int dst_im، int src_im، int dty، int dty، int srcy، int srcy، int dstw، int dsth، int srcw، int srch)

این ویژگی یکی از قدرتمند ترین و جهانی ترین است. با استفاده از آن، می توانید تصاویر (یا بخش های آنها) را کپی کنید، آنها را حرکت دهید یا آنها را مقیاس کنید.

dst_im شناسه تصویر را مشخص می کند که در آن نتیجه عملکرد قرار می گیرد. این تصویر باید قبلا ایجاد یا بارگذاری شود و ابعاد مناسب داشته باشد.

src_im - شناسه تصویر که در آن کار انجام می شود. با این حال، src_im و dst_immogut و همزمان هستند.

مولفه های srcx, srcy., srcw, سرگردان منطقه را داخل تصویر منبع بالا مشخص کنید که عملیات انجام خواهد شد به ترتیب، مختصات گوشه بالا سمت چپ آن، عرض و ارتفاع آن.

سرانجام، چهار dstx, دارت, dstw, دره محل را در تصویر مشخص می کند dst_imکدام یک از مستطیل های مشخص شده در چهار سال گذشته "فشرده" خواهد بود. توجه داشته باشید که اگر عرض یا ارتفاع دو مستطیل، همخوانی نداشته باشد، تصویر به طور خودکار طراحی شده است تا کشش یا فشرده شود.

در مثال زیر file1.jpg دو بار کاهش می یابد و به فایل می نویسد file2.jpg:

تصحیح شده

الگوی تخریب

نحو:

Int Imagedestroy (INT IM)

تابع توصیفگر را از بین می برد من هستم. الگوی قبلا ایجاد شده (مانند بسته شدن یک فایل fclose () پس از باز کردن fopen ()).

اگر شما یک توسعه دهنده پی اچ پی هستید، احتمالا نه تنها در مورد کتابخانه گرافیک کتابخانه GD شنیده اید. برای کسانی که با آن آشنا نیستند، من کتابخانه GD را توضیح می دهم که به شما اجازه می دهد تصاویر را ایجاد کنید، آنها را تغییر دهید، آنها را تغییر دهید و آنها را مدیریت کنید. امروزه ما با استفاده از AzA در کتابخانه GD کتابخانه PHP آشنا خواهیم شد.

در درجه اول

اطمینان حاصل کنید که کتابخانه GD در سرور شما نصب شده و فعال شده است. نمی دانید چگونه این کار را انجام دهید؟ نگران نباشید، همه چیز ساده است! شما فقط باید یک فایل پی اچ پی را بر روی سرور ایجاد کنید، سپس موارد زیر را وارد کنید:

در حال حاضر صفحه مرورگر را باز کنید و یک لیست عظیمی از ویژگی های نسخه PHP خود را مشاهده خواهید کرد. به پایین پایین بروید، بخش "GD" را پیدا کنید و مطمئن شوید که کتابخانه متصل است. اگر نه، با شرکت میزبانی سرویس میزبانی تماس بگیرید. خوشبختانه، در اکثر سرورها، که در آن من قبلا موفق به کار و کار، کتابخانه GD نصب شده و متصل شده است.

نکات برجسته

بیایید از طریق برخی از لحظات بزرگ برویم اول، ما آن را به طوری که تمام گزارش های خطا توسط مرورگر صادر می شود. این را می توان با وارد کردن موارد زیر در ابتدای کد پی اچ پی خود به دست آورد:

ERROR_RERPORTING (E_ALL)؛
?>

یک مربع را بکشید

بیایید با ساده ترین و با کمک پی اچ پی مربع آبی شروع کنیم - البته هیچ چیز فوقالعاده ای نیست، اما لازم است که با اصول اولیه مقابله کنیم. برای دریافت مربع مورد نظر، باید اقدامات زیر را انجام دهید:

نوع محتوا را به عنوان "تصویر" تنظیم کنید تا مرورگر بتواند تصویر را به درستی تفسیر کند؛
. یک تصویر خالی جدید را با تنظیم عرض و ارتفاع مورد نظر ایجاد کنید.
. رنگ پس زمینه رنگ آبی؛
. گزینه نهایی تصویر را ذخیره کنید و آن را به مرورگر انتقال دهید؛
. پاک کردن حافظه ای که برای ایجاد و ذخیره تصویر مورد استفاده قرار گرفت؛
. نمایش تصویر تصویر از فایل index.php

حالا که ما بر روی روش عمل تصمیم گرفتیم، می توانید برنامه نویسی را شروع کنید. من سعی کردم در مورد هر خط کد، و در مورد توابع مورد استفاده در فرآیند رمزگذاری، سپس بعدا صحبت خواهم کرد. بنابراین، در اینجا کد برای ایجاد مربع آبی ما است. پس از نوشتن، ما آن را تحت نام "basic_square.php" ذخیره خواهیم کرد.

// نمایش پیام های خطا را نصب کنید
ini_set ("display_errors"، "1")؛
ERROR_RERPORTING (E_ALL)؛


// ابعاد تصویر را تعیین کنید
// عرض 125 پیکسل، ارتفاع 125 پیکسل
$ image \u003d ImageCreate (125، 125)؛

// رنگ پس زمینه را انتخاب کنید
$ blue \u003d imagecolorallocate ($ تصویر، 0، 0، 255)؛

// رنگ دیگری را تنظیم کنید - فقط مطمئن شوید که زمانی که الگوی نمایش داده می شود، پس زمینه اولین رنگ است ()
// توجه - مربع آبی، قرمز نیست.
$ RED \u003d ImagecolorAlocate ($ تصویر، 255، 0، 0)؛

// فایل را در فرمت PNG ذخیره کنید و آن را نمایش دهید.
imagePng ($ تصویر)؛

// تمیز کردن حافظه استفاده می شود
Imagedestroy ($ تصویر)؛
?>

در حال حاضر اجازه دهید تمام توابع مورد استفاده و هر مرحله از کد بالا را در نظر بگیریم تا بهتر درک کنیم که چه کاری انجام می دهیم:

همانطور که قبلا توضیح دادم، یک گزینه پیام خطا را اضافه می کنیم تا سریعا آنها را در صورت لزوم تعمیر کنیم
. سپس ما از تابع هدر () برای تنظیم نوع محتوا - PNG استفاده می کنیم
. ما تصویر را ذخیره می کنیم و عرض و ارتفاع مورد نظر را نصب می کنیم - جزئیات بیشتر را مشاهده کنید.
. سپس از تابع ImagecolorAlocate برای انتخاب رنگ آبی برای پس زمینه نقاشی ما استفاده کنید. لطفا توجه داشته باشید که در نسخه نهایی یک رنگ نصب شده اول وجود خواهد داشت، بنابراین مربع ما تبدیل به آبی، نه قرمز.
. برای ذخیره سازی نهایی تصویر، ما از imagePNG () استفاده می کنیم. اگر می خواهید تصویر را در هر دایرکتوری ذخیره کنید، باید پارامترهای اضافی را وارد کنید.
. و در نهایت، ما حافظه را با استفاده از تابع Imagedestroy تمیز می کنیم ()

ما می توانیم با باز کردن فایل blue_square.php به مربع ما را نگاه کنیم، و حتی اگر ما یک پیوند به آن را در صفحه اصلی تنظیم کنیم، بهتر خواهد شد:

اگر همه چیز به درستی انجام شود، این مربع آبی را خواهید دید:

سلام دنیا

در حال حاضر، هنگامی که ما آموخته ایم که چگونه تصاویر ایجاد کنیم، سعی کنیم یک تصویر را با متن نوشته شده توسط فونت انتخابی ما ایجاد کنیم. ما می توانیم از هر فونت از دایرکتوری TrueType Font (.TFF) استفاده کنیم. در مثال های زیر، من از فونت "ظهور" استفاده خواهم کرد. بیایید "دنیای سلام" را در یک میدان خاکستری تیره بنویسیم. توجه، به کد نگاه کنید، و سپس هر مرحله را به طور دقیق جدا کنید.

ini_set ("display_errors"، "1")؛
ERROR_RERPORTING (E_ALL)؛


سربرگ ("نوع نوع: تصویر / PNG")؛

// تعیین اندازه تصویر - 300x300 پیکسل

// پس زمینه خاکستری تیره را نصب کنید

// مسیر را به فونت نشان می دهد
$ font_path \u003d "advent_light"؛

// ما متن را نوشتیم
$ string \u003d "سلام جهان!"؛

// متن و تصاویر را وصل کنید
Imageettftext ($ تصویر، 50، 0، 10، 160، $ white، $ font_path، $ string)؛

// ذخیره تصویر
imagePng ($ تصویر)؛

// پاک کردن حافظه
Imagedestroy ($ تصویر)؛
?>

کد را در فایل 'hello_world.php ذخیره کنید، ما آن را همانگونه که در بالا ذکر شد، باز خواهیم کرد. پس اینجا چه خبر؟

ما اندازه تصویر 300 * 300 پیکسل را تنظیم کردیم و یک پس زمینه خاکستری تیره استفاده می کنیم
. لطفا توجه داشته باشید که چگونه مسیر فونت را با استفاده از نام فونت اشاره کردیم: واقعیت این است که بیشتر در کد ما باید متن را به تصویر اعمال کنیم. همچنین فراموش نکنید که نام فونت بدون گسترش نوشته شده است. با این حال، بستگی به نسخه کتابخانه GD از PHP دارد: اگر نام فونت با '/' شروع نمی شود، لازم است TTF را گسترش دهیم - یعنی اگر شما قبل از نام ما ایستاده اید، لازم نیست فونت، به طور خودکار به TTF اضافه خواهد شد.
. سپس ما "سلام جهان را بنویسیم!" و ذخیره متن برای استفاده بیشتر
. مهمترین عملکرد مورد استفاده در این کد ImagetTeftext ()، نیاز به دستورالعمل 8 پارامترهای: مسیر تصویر، اندازه تصویر، زاویه گرایش، محور x، محور Y، رنگ، فونت، متن (در این منظور)

کد را ذخیره کنید، آن را به هیچ وجه باز کنید، و این تصویر را خواهید دید:

بچرخانش!

شما متوجه شدید که تابع ImageettFtext اتصال متن و تصویر پارامتر به موقعیت در یک زاویه است "؟ بنابراین ما می توانیم متن خود را در هر زاویه تبدیل کنیم. بیایید کد را بازنویسی کنیم و خط را روی مربع روشن کنیم.

// پیام های خطا را نصب کنید
ini_set ("display_errors"، "1")؛
ERROR_RERPORTING (E_ALL)؛

// نوع محتوا را نصب کنید
سربرگ ("نوع نوع: تصویر / PNG")؛

// تعیین اندازه تصویر: 300x300 پیکسل
$ image \u003d ImageCreate (300، 300)؛

// تعیین رنگ پس زمینه - خاکستری تیره
$ dark_grey \u003d imagecolorallocate ($ تصویر، 102، 102، 102)؛
$ white \u003d imagecolorallocate ($ تصویر، 255، 255، 255)؛

// مسیر را به فونت نشان می دهد
$ font_path \u003d "advent_light"؛

// ما متن را نوشتیم
$ string \u003d "سلام جهان!"؛

// متن و تصاویر را وصل کنید
ImageettfText ($ تصویر، 50، -45، 30، 70، $ سفید، $ font_path، $ رشته)؛

// ذخیره تصویر
imagePng ($ تصویر)؛

// پاک کردن حافظه
Imagedestroy ($ تصویر)؛
?>

لطفا توجه داشته باشید، ما مقدار -45 درجه را به جای 0 درجه تنظیم می کنیم (همانطور که در مثال قبلی) - این همه چیزی است که برای تبدیل متن مورد نیاز است. به تصویر نگاه کن.

چطور؟ جالب هست؟ نه؟ سپس اجازه دهید سعی کنیم کاری انجام دهیم.

امروز شماره چیست؟

ما نه تنها می توانیم تصاویر خود را قرعه کشی کنیم، بلکه از آماده استفاده می کنیم! رمزگذاری کمی، و ما یک تقویم داریم که تاریخ فعلی (ماه، روز و سال) را نمایش می دهد. ما به دنبال یک قطعه کار تقویم در گوگل، ما یک تصویر را در format.svg پیدا می کنیم - اندازه آن را تغییر دادم و به فرمت PNG ترجمه شد. نگاهی به قطعه کار:

در حال حاضر ما پایه ای داریم و می توانیم آن را با استفاده از توابع GD و PHP پردازش کنیم. من هشدار می دهم که من تظاهر نمی کنم که عنوان بزرگترین طراح در جهان باشد - شاید دیگر قطعه کار و فونت دیگری در سایت بهتر شود. بنابراین طراحی شما است، اما در حال حاضر اجازه دهید به کد نگاه کنید:

// پیام های خطا را نصب کنید
ini_set ("display_errors"، "1")؛
ERROR_RERPORTING (E_ALL)؛

// نوع محتوا را نصب کنید

// تاریخ را نگه دارید
فهرست (ماه ماه، دلار، سال) \u003d Explode ("/"، تاریخ ("f / js / y"))؛

// دانلود تصویر پس زمینه
$ IMAGE \u003d IMAGECREATTFROMG ("CALENDAR_BLANK.PNG")؛
$ image_width \u003d imagesx ($ تصویر)؛

// تعیین رنگ پس زمینه و فونت
$ white \u003d imagecolorallocate ($ تصویر، 255، 255، 255)؛
$ black \u003d imagecolorallocate ($ تصویر، 0، 0، 0)؛
$ font_path \u003d "advent_light"؛

// موقعیت متن را مشخص کنید
$ POS_MONTH \u003d IMAGETTFBBOX (13، 0، $ font_PATH، $ ماه)؛
$ pos_day \u003d ifixettfbbox (25، 0، $ font_path، $ day)؛
$ POS_YEAR \u003d IMACTETFBBOX (8، 0، $ font_path، سال)؛

// من یک ماه نوشتم
Imageettftext ($ تصویر، 13، 0، ($ image_width - $ pos_month) / 2، 40، $ white، $ font_path، $ ماه)؛

// روز نوشتن
Imageettftext ($ تصویر، 25، 0، ($ image_width - $ pos_day) / 2، 80، $ black، $ font_path، $ day)؛

// ما سال نوشتیم
Imageettftext ($ تصویر، 8، 0، ($ image_width - $ POS_YEAR) / 2، 100، $ black، $ font_path، $ سال)؛

// ذخیره تصویر
ImageJPEG ($ تصویر، "، 100)؛

// پاک کردن حافظه
Imagedestroy ($ تصویر)؛
?>

بنابراین، ما اینجا کار میکنیم؟ تابع لیست () چیست؟ بیایید آن را شکل دهیم:

همانطور که همیشه، ما نوع محتوا را تنظیم می کنیم تا تصویر به درستی نمایش داده شود.
. در خط دهم شما ویژگی تابع لیست را می بینید. ما فرمت تاریخ را با استفاده از تابع انفجار () تعریف می کنیم و آن را ذخیره می کنیم. بنابراین، شما می توانید هر گونه اطلاعات را ترتیب دهید. در حال حاضر ما به اطلاعات مربوط به ماه جاری، روز و سال دسترسی داریم.
. در رشته های 22-24، ما از تابع ImageTtFbbox () برای سازماندهی فرمت تاریخ استفاده می کنیم. این تابع نمایش تاریخی را در سفارش مشخص شده تضمین می کند و برای دسترسی به گوشه پایین سمت راست ما $ pos_month را می نویسیم. همه اینها لازم است که متن به طور خودکار به طور خودکار قرار گیرد، صرف نظر از اندازه آن.
. سپس ما هر خط را به نوبه خود ایجاد می کنیم و اندازه متن را در امتداد محور x تنظیم می کنیم.

اگر هیچ فاجعه ای رخ نداده باشد، باید تصویر زیر را ارائه دهید، با تنها تفاوت که تاریخ آن است که بر روی کامپیوتر شما نصب شده است - نقاشی من، همانطور که می توانید حدس بزنید، استاتیک. برای کمک به اسکریپت به لطف سایت Catpin.

گربه ها و فیلترهای تصویر

آخرین چیزی که من امروز به شما آموزش خواهم داد، این ها فیلترها از تصاویر هستند - یک چیز بسیار جالب، به من اعتماد کنید. ویژگی ImageFilter () تصویر به پایان رسید و آن را به روش خاصی تغییر می دهد - به عنوان مثال، آن را به حالت سیاه و سفید تبدیل می شود. بیایید نگاهی به تصویری که ما در فرم اصلی آن کار خواهیم کرد.

حالا اجازه دهید گربه سیاه و سفید را با استفاده از تابع فیلتر تصویر تصویر بسازیم.

// پیام های خطا را نصب کنید
ini_set ("display_errors"، "1")؛
ERROR_RERPORTING (E_ALL)؛

// بررسی کنید که تصویر اصلی تنظیم شده باشد
اگر (isset ($ _ get ["منبع"]) (
// انجام پردازش پایه نقاشی
$ image \u003d filter_var ($ _ get ["منبع"]، filter_sanitize_string)؛

// آپلود یک تصویر
$ IMAGE \u003d IMAGECREATEFROMJPEG ($ تصویر)؛

// ترجمه آن به حالت سیاه و سفید
ImageFilter ($ تصویر، img_filter_grayscale)؛

// نوع محتوا را نصب کنید
سربرگ ("نوع نوع: تصویر / JPEG)؛

// تصویر را به عنوان 90٪ نگه دارید
ImageJPEG ($ تصویر، "، 90)؛

// پاک کردن حافظه
Imagedestroy ($ تصویر)؛
}
?>

اسکریپت فوق به اندازه کافی انعطاف پذیر است، بنابراین شما به راحتی می توانید هر نقاشی سیاه و سفید را مانند این ترکیب کنید:

ما هر عکس "منبع" را وارد کردیم، و به زودی تبدیل به سیاه و سفید می شود. کسانی که قصد استفاده از این ویژگی را در سرورهای عمومی در دسترس دارند، نیاز به اقدامات امنیتی بیشتری دارند. اگر چه در اسکریپت فوق، این نوع نوع است. JPEG، شما می توانید از تابع برای پردازش هر فایل گرافیکی استفاده کنید. حالا گربه ما به نظر می رسد این است:

فیلتر های دیگر:

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

فیلتر روشنایی

برای روشنایی تصویر مربوط به پارامتر سوم است:


// پارامتر سوم سطح روشنایی تصویر را تنظیم می کند.
ImageFilter ($ تصویر، img_filter_brightness، 40)؛
ImageJPEG ($ تصویر، "، 90)؛
Imagedestroy ($ تصویر)؛
?>

blur Gaussian

Blur بیش از گاوس، هیچ پارامتر اضافی

سربرگ ("نوع نوع: تصویر / JPEG)؛

$ IMAGE \u003d IMAGECREATEFROMJPEG ("CAT.JPG")؛
ImageFilter ($ تصویر، img_filter_gaussian_blur)؛
ImageJPEG ($ تصویر، "، 90)؛
Imagedestroy ($ تصویر)؛
?>

تضاد

پارامتر سوم کنتراست را تعیین می کند

سربرگ ("نوع نوع: تصویر / JPEG)؛
$ IMAGE \u003d IMAGECREATEFROMJPEG ("CAT.JPG")؛
ImageFilter ($ تصویر، IMG_FILTER_CONTRAST، -15)؛
ImageJPEG ($ تصویر، "، 90)؛
Imagedestroy ($ تصویر)؛
?>

از بین بردن مقدار متوسط \u200b\u200b(اثر الگو)

هیچ پارامتر اضافی

سربرگ ("نوع نوع: تصویر / JPEG)؛
$ IMAGE \u003d IMAGECREATEFROMJPEG ("CAT.JPG")؛
ImageFilter ($ تصویر، img_filter_mean_removal)؛
ImageJPEG ($ تصویر، "، 90)؛
Imagedestroy ($ تصویر)؛
?>

تعادل رنگ

اشباع قرمز، سبز، آبی، و همچنین کانال آلفا (اختیاری) را در سفارش زیر تنظیم می کند

سربرگ ("نوع نوع: تصویر / JPEG)؛
$ IMAGE \u003d IMAGECREATEFROMJPEG ("CAT.JPG")؛
// پارامتر کانال آلفا در زیر به عنوان اختیاری حذف شده است.
ImageFilter ($ تصویر، img_filter_colorize، 50، 0، 0)؛
ImageJPEG ($ تصویر، "، 90)؛
Imagedestroy ($ تصویر)؛
?>

به جلسات جدید ...

امیدوارم که شما بیشتر یا کمتر با کتابخانه GD در پی اچ پی برخورد کنید. در بخش دوم، ما به برخی از تکنیک های پیشرفته نگاه خواهیم کرد و البته، حتی جالب تر می بینیم. از کتابخانه GD و توانایی های خلاق خود استفاده کنید و مطمئن شوید که به من بگویید که چه چیزی دارید!

شرکت کنندگان عزیز در پروژه در حال حرکت! امروز شما منتظر یک موضوع جالب دیگری هستید. ما همه مورد استفاده قرار می گیریم، می گویند، آواتار های جدید را در شبکه های اجتماعی آپلود می کنیم. اما چگونه آنها به اندازه مورد نظر مقیاس می شوند؟ چه اتفاقی می افتد بر روی سرور؟ این و بسیاری از سوالات دیگر در انتظار شما تحت گربه هستند.

بله، اگر کسی آگاه نیست، سپس در اصطلاحات اینترنتی "گربه" (از برش انگلیسی "برش)، این جایی است که اخبار را برای کوتاه (در لیست کلی) و ارائه کامل به اشتراک می گذارد.

بسیاری می دانند که من سیستم مدیریت وب سایت خودم را به نام Kogir (CoGear، http://cogear.ru) توسعه می دهم. داستان پیچیده و طولانی است، اما به شدت به هدف می رود.

بیایید جنبه های اساسی کار با تصاویر را ببینیم.

پی اچ پی دارای یک کتابخانه داخلی GD است. در اینجا مستندات آن است:

http://php.net/manual/ru/book.image.php.

در این صفحه تعداد زیادی از توابع مختلف را پیدا خواهید کرد. اما نترس ما به طور کامل علاقه مند هستیم.

همانطور که می بینید، کار با تصاویر تا کنون در قالب روش ها (توابع) اتفاق می افتد، بنابراین پوسته شی گرا باید نوشتن شود.

ساده ترین مثال از کار با تصویر:

ما در دستگاه محلی سعی می کنیم.

یک فایل ایجاد کنید image.php(من یک دامنه محلی برای آزمایشات دارم test.Local).

ما در ریشه test.local قرار داده ایم پوشه سایت: 1.jpg تصویر:

تماس بگیرید در مرورگر http: //test.local/Image.php (در مورد شما، آدرس دیگری).

ما در پوشه تصویر 2.jpg پیدا می کنیم:

نسبت ها حفظ نمی شود، همانطور که می بینید. از آنجا که ما آنها را دوباره محاسبه نکردیم.

ما اسکریپت ما را اصلاح خواهیم کرد تا دوباره محاسبه شود:

$ ratio_orig) ($ width \u003d $ ارتفاع * $ ratio_orig؛) else ($ height \u003d $ width / $ ratio_orig؛) // انتقال تصویر از فایل در وب با تغییر در مقیاس ImageCopyResamPled ($ image_p، $ تصویر، 0، 0، 0، 0، $ width، $ ارتفاع، $ width_orig، $ height_orig)؛ // نمایش ImageJPEG ($ image_p، "2.jpg"، 100)؛

بیایید نگاه کنیم:

از آنجایی که ما در ارتفاع محاسبه شدیم، بخشی از تصویر نهایی تبدیل به سیاه شد (رنگ اصلی بوم ایجاد شده).

چه چیز دیگری می توانید با تصویر انجام دهید؟ آن را برش دهید، به نوبه خود، قرار دادن یک چیز به دیگری، قرعه کشی بر روی آن.

من مطمئن هستم که شما به کلاس من علاقه مند خواهید شد تا با تصاویر کار کنید. این کار خارج از سیستم کار نمی کند، زیرا این یک راننده برای چرخ دنده (ماژول) "تصاویر" است.

اما شما چیزهای جالب زیادی را برای خودتان پیدا خواهید کرد:

* copyright کپی رایت (c) 2012، belyaev dmitry * license http://cogear.ru/license.html * link http://cogear.ru * / class image_driver_gd extensions image_driver_abstract (/ ** * ایجاد یک تصویر * / Case ImageType_JPEG: Case ImageType_JPEG2000: $ این-\u003e Source \u003d ImageCreateFromJPEG ($ این-\u003e INFO-\u003e FILE)؛ BREAK؛ CASE IMAGETYPE_PNG: $ این-\u003e SOUCCE \u003d IMAGECREATEFROMG ($ این- \u003e info-\u003e file) iMagecolorTransParent ($ این منبع-\u003e منبع، imagecolorallocate ($ this-\u003e source، 0، 0، 0))؛ iMagesAveAlpha ($ این-\u003e منبع، درست است)؛ شکستن؛ Case ImageType_gif: $ این-\u003e Source \u003d ImageCreateFromGif ($ این-\u003e info-\u003e file)؛ ImagecolorTransparent ($ این-\u003e منبع، Imagecolorallocate ($ این-\u003e منبع، 0، 0، 0))؛ iMagesAsaveAlphending ($ thise\u003e source، false)؛ imagesasavealpha ($ این-\u003e منبع، درست)؛ شکستن؛ Case ImageType_ico: $ این-\u003e Source \u003d ImageCreateFromWBMP ($ این-\u003e info-\u003e file)؛ شکستن؛) / ** * تصویر را از بین می برد * / عملکرد عمومی از بین بردن () (Imagedestroy ($ این منبع-\u003e منبع)؛ is_resource ($ این-\u003e هدف) && Imagedestroy ($ این-\u003e هدف)؛ ) / ** * یک تصویر هدف را ایجاد می کند * * param مخلوط $ عرض * param مخلوط $ ارتفاع * / عملکرد عمومی createtarget ($ عرض، ارتفاع $) ($ این-\u003e هدف \u003d ImageCreatusolor ($ عرض، ارتفاع $)؛ اگر ($ این-\u003e INFO-\u003e \u003c\u003c\u003cbr\u003e \u003cbr\u003e \u003cbr\u003e \u003cbr\u003e \u003cbr\u003e \u003cbr\u003e \u003cbr\u003e \u003cbr\u003e \u003cbr\u003e \u003cbr\u003e \u003cbr\u003e \u003cbr\u003e \u003cbr\u003e \u003cbr\u003e \u003cbr\u003e \u003cbr\u003e \u003cbr\u003e \u003cbr\u003e \u003cbr\u003e \u003cbr\u003e \u003cbr\u003e \u003cbr\u003e \u003cbr\u003e \u003cbr\u003e \u003cbr\u003e \u003cbr\u003e \u003cbr\u003e \u003cbr\u003e \u003cbr\u003e \u003cbr\u003e \u003cbr\u003e \u003cbr\u003e \u003cbr\u003e \u003cbr\u003e \u003cbr\u003e \u003cbr\u003e \u003cbr\u003e ) ($ این-\u003e\u003e info-\u003e نوع) iGagesAveAlpha ($ این-\u003e هدف، true)؛) بازگشت $ این-\u003e هدف؛) / ** * تغییر مقیاس از تصویر * * param int | عرض $ عرض عرض * @ param int | @ param enter ارتفاع ارتفاع $ * param string $ fit width scaling نوع، ارتفاع، مناسب * param int | string $ scale scale scale images scoring هر چیزی، پایین * return image image * / تابع عمومی تغییر اندازه ($ عرض، ارتفاع $، $ fit \u003d "عرض"، $ scale \u003d "هر") ($ source_width \u003d $ this-\u003e smartsize ($ width، width ")؛ $ source_height \u003d $ این-\u003e smartsize ($ ارتفاع، "ارتفاع")؛ // نوع مقیاس سوئیچ سوئیچ ($ fit) را بررسی کنید (// / / اگر انتخاب کنید ناخن عرض، پس ما ارتفاع را به نسبت مطلوب مورد "عرض" می دهیم: $ width \u003d $ source_width؛ $ ارتفاع \u003d دور (($ source_width * $ this-\u003e info-\u003e ارتفاع) / $ این-\u003e info-\u003e عرض)؛ زنگ تفريح؛ // اگر ارتفاع کوه، سپس عرض را به نسبت مورد نظر مورد "ارتفاع" بدهید: $ width \u003d دور (($ این-\u003e info-\u003e عرض * $ source_height) / $ این-\u003e info-\u003e ارتفاع ) $ ارتفاع \u003d $ source_height؛ زنگ تفريح؛ مورد "محصول": اگر ($ این-\u003e info-\u003e عرض\u003e $ this-\u003e info-\u003e ارتفاع) ($ width \u003d round (($ این-\u003e info-\u003e عرض * $ source_height) / $ این-\u003e اطلاعات -\u003e ارتفاع)؛ $ ارتفاع \u003d $ source_height؛) else else ($ width \u003d $ source_width؛ $ ارتفاع \u003d دور (($ -\u003e INFO-\u003e ارتفاع * $ source_width) / $ این-\u003e info-\u003e عرض)؛ ) شکستن؛ // به طور پیش فرض ما به سادگی کشش پیش فرض: مورد "fit" :) // بررسی اینکه آیا سوئیچ ساخته خواهد شد ($ مقیاس) (// اگر تصویر بزرگتر از اندازه های مشخص شده، هیچ چیز اتفاق نمی افتد به آن "بالا": اگر ( $ عرض< $this->info-\u003e عرض و ارتفاع $< $this-> اطلاعات-\u003e ارتفاع) (بازگشت $ این؛) شکستن؛ // اگر یک تصویر کوچکتر از اندازه های مشخص شده باشد، هیچ چیز به "پایین" با آن اتفاق نمی افتد: اگر ($ width\u003e $ this-\u003e info-\u003e width && $ height\u003e $ this-\u003e info-\u003e ارتفاع) (بازگشت $ این؛) شکستن؛ مورد "هر": به طور پیش فرض: // هیچ کاری انجام ندهید. fiLonym) $ این-\u003e target \u003d $ this-\u003e createetarget ($ عرض، ارتفاع $)؛ اگر (تصویر\u003e هدف، $ این-\u003e منبع، 0، 0، 0، 0، $ عرض، $ ارتفاع، $ this-\u003e info-\u003e عرض، $ این-\u003e info-\u003e ارتفاع)) ($ این-\u003e source \u003d $ thise-\u003e target؛ $ این-\u003e info-\u003e width \u003d $ width؛ $ this-\u003e info-\u003e height \u003d $ height؛ اگر ("محصول" \u003d\u003d $ fite) (بازگشت $ این -\u003e Crop "مرکز"، "مرکز"، $ source_width، $ source_height)؛)) بازگشت $ این؛ ) / ** * تولید کننده یک تصویر * * param مخلوط $ X مختصات برش x * param مخلوط $ y مختصات برش y * @ param مخلوط $ عرض عرض عرض * @ param مخلوط $ ارتفاع هرس ارتفاع * return شیء تصویر * / محصول عملکرد عمومی ($ x، $ y، $ عرض، $ ارتفاع) ($ x \u003d $ این-\u003e smartsize ($ x، width ") - $ عرض / 2؛ $ y \u003d $ این-\u003e smartsize ($ y، "ارتفاع") - ارتفاع $ / 2؛ $ width \u003d $ این-\u003e smartsize ($ عرض، "عرض")؛ $ ارتفاع \u003d $ این-\u003e smartsize (ارتفاع $، "ارتفاع")؛ $ این-\u003e target \u003d $ این createetarget ($ عرض، ارتفاع $)؛ if-\u003e target، $ این-\u003e منبع، 0، $ x، $ y، $ عرض، $ ارتفاع، $ عرض، ارتفاع $)) ($ -\u003e source \u003d $ this-\u003e target؛ $ thint؛\u003e width \u003d $ width؛ $ this-\u003e info-\u003e height \u003d $ height؛) بازگشت $ این؛) / ** * تصاویر Maging * / عملکرد عمومی ادغام (تصویر $ image، $ x، $ y، $ percent \u003d 100) ($ x \u003d $ این-\u003e smartsize ($ x، width ")؛ $ y \u003d $ این-\u003e smartsize ($ y،" ارتفاع " ) IF- (ImageCopyMerge ($ این-\u003e منبع، $ image-\u003e GetSource ()، $ x، $ y، 0، 0 ، $ Image-\u003e Object () -\u003e Image-\u003e Width، $ Image-\u003e Object () -\u003e Image-\u003e ارتفاع، دلار)) () بازگشت $ این؛ ) / ** * صرفه جویی در یک تصویر * / عملکرد عمومی ذخیره ($ file \u003d null، $ options \u003d array ()) ($ این-\u003e هدف یا $ target \u003d $ target \u003d $ this-\u003e منبع؛ اگر (strs) فایل، ".") یا $ file \u003d $ this-\u003e info-\u003e file) ($ ext \u003d pathfo ($ file، pathfo_extension)؛ $ ext \u003d strtolower ($ EXT)؛) else else ($ ext \u003d strtolower ($ file ) $ file \u003d null؛) سوئیچ ($ ext) (case "jpg": case "jpeg": $ options یا $ options \u003d 90؛ ImageJPEG ($ این هدف، $ file، $ گزینه ها)؛ شکستن؛ مورد "GIF": IMAGECOLORTRANSPARENT ($ این هدف، IMAGECOLORALLOCATEALPHA ($ این-\u003e هدف، 0، 0، 127))؛ iMagesAveAlpha ($ این-\u003e هدف، درست است)؛ ImageGif ($ این هدف، $ فایل)؛ شکستن؛ Case "PNG": iMagesAsaveAlpha ($ این-\u003e هدف، درست)؛ اگر (IS_NUMERIC ($ گزینه ها)) ( $ quality \u003d $ options؛ $ filters \u003d png_no_filter؛) else ($ quality \u003d isset ($ options ["کیفیت])؟ $ گزینه ها ["کیفیت"]: 9؛ $ filters \u003d isset ($ options ["filters"])؟ $ گزینه ها ["فیلترها"]: png_no_filter؛ ) imagePNG ($ thise-\u003e target، $ file، $ caligence، $ filters)؛ زنگ تفريح؛ ) $ این-\u003e نابود کردن ()؛ ) / ** * نمایش تصویر * / خروجی عملکرد عمومی ($ فرمت، $ گزینه ها) ($ این-\u003e ذخیره ($ فرمت، $ گزینه ها)؛))

چگونه در سیستم کار می کند؟ برای کد بسیار زیاد؟

دیدن:

$ image \u003d تصویر جدید ("1.jpg")؛ $ IMAGE-\u003e تغییر اندازه (200،200، "عرض") -\u003e محصول (200،200) -\u003e ذخیره ("2، jpg)؛

آیا می فهمی؟ به صورت خودکار با تمام فرمت های لازم کار می کند. کاربردی، در صورت لزوم، می تواند گسترش یابد.

تکالیف برای شما آنچه را که در بالا ذکر شده است (به کلاس من) بر روی دستگاه محلی انجام دهید. اگر می خواهید و زمان را با پارامترها آزمایش کنید.