08-07-2005, 05:40
|
|
|
חבר מתאריך: 20.02.03
הודעות: 2,396
|
|
מדריכון - הקטנת תמונות GIF עם שמירה על רקע שקוף
מדריך זה מוגן בזכויות יוצרים. כל הזכויות שמורות לדקל מנהל פורום PHP.
אין להעתיק / להפיץ / לשנות בכל אמצעי, אלקטרוני או מכני את מדריך זה, ללא אישור בכתב מראש מכותבו.
נציג תחילה את הבעיה. אחת הפונקציות המיועדות להקטנת תמונות באמצעות GD הינה הפונקציה imagecopyresampled. הפונקציה מיועדת להקטנה+חיתוך (כלומר,אפשרות לקחת רק חלק מהתמונה, ולא להקטין את כל התמונה). הייתרון - יצירת תמונות אצבע (thumbnails) השומרות על הפרופורציה המקורית של התמונה, אולם חתוכות לגודל המתאים. הבעיה היא שעל מנת לשמור על שקיפות של תמונות GIF יש צורך להשתמש בפונקציה imagecopymerge אשר לא מכילה את האופציות של imagecopyresampled.
נסביר אם כן כיצד לבצע את ההקטנה עם שמירה על רקע שקוף (במידע וקיים רקע כזה).
[הערה - הקוד יוצר תמונת אצבע ברזולוציה של 80 על 60 או 60 על 80 (בהתאם ליחס רוחב:אורך של התמונה המקורית)]
הערה כללית - קבצי GIF מכילים עד 256 צבעים, כאשר ניתן להגדיר לכל קובץ צבע אחד שהוא שקוף. באמצעות הגדרה זו - נשמר הצבע כחלק מהתמונה, אולם התוכנות המציגות את התמונה יודעות להציג צבע זה כשקוף.
נעבור אם כן לקוד ולהסברים
קוד PHP:
$file = 'someimage.gif';
list($width, $height) = getimagesize($file);
if ($width>$height) // בדיקה האם מדובר בתמונה רחבה או ארוכה
{
$new_width=80;
$new_height=(round(($height/$width)*$new_width));
}
else
{
$new_height=60;
$new_width=(round(($width/$height)*$new_height));
}
$image_p = imagecreate($new_width, $new_height); // יצירת תמונה חדשה בגודל המתאים.
$image = imagecreatefromgif($dir.$file); // טעינת התמונה המקורית להמשך העבודה
$transcolor=imagecolortransparent($image); // שמירת הצבע השקוף הנוכחי בתמונה
// חשוב לשים לב כי במידה ולא קיים צבע נוכחי שקוף, הפונקציה תחזיר -1
if($transcolor>=0) // במידה והיה מוגדר צבע מסויים כשקוף בתמונה המקורית, נגדיר בתמונה החדשה את הצבע הזה כצבע הרקע.
{
$ar = imagecolorsforindex($image,$transcolor); // הוצאת ערכי RGB של צבע הרקע שהוגדר להיות שקוף.
$new_trans =imagecolorallocate($image_p,$ar[0],$ar[1],$ar[2]); // הגדרת צבע הרקע של התמונה החדשה להיות הצבע שהוגדר כשקוף בתמונה המקורית.
imagecolortransparent($image_p,$new_trans); // נגדיר את הצבע הזה כצבע שקוף
}
imagecopyresampled($image_p, $image, round(($imagethumbsize-$new_width)/2), round(($imagethumbsize-$new_height)/2), 0, 0, $new_width, $new_height,$width, $height); // נקטין את התמונה על פי המימדים המתאימים
header('Content-type: image/gif'); // נוציא את התמונה כפלט
imagegif($image_p);
אשמח לשמוע את דעתכם, ובמידה והשתמשתם בקוד זה.
וכמובן - אם יש שאלות אשמח להבהיר דברים לא ברורים
בהצלחה, דקל
_____________________________________
"מתכנת זה אדם שפותר בעיה שעל קיומה לא ידעת, בדרך שאינך מבין"
|