PDA

View Full Version : سوال: تغییر حجم تصویر؟؟؟؟؟



chaown
سه شنبه 23 اسفند 1390, 00:57 صبح
سلام
من تویه دیتابیسم آدرس تصویر رو ذخیره می کنم و خود تصویر تویه هاست قرار دارد.

می خوام از یه تصویر در جاهای مختلف با اندازه های مختلف استفاده کنم.

تویه اینترنت یه سرچ کردم فقط آموزشهایی گذاشته شده بود که عکس رو مستقیم از دیتابیس گرفته باشن و بدرد من نمی خوردن

|| البته تغییر اندازه تصویر توسط کدهای html کار جالبی نیست چون حجم تصویر تغییر نمی کنه ||

لطفا کمکم کنید.

Unique
سه شنبه 23 اسفند 1390, 01:07 صبح
توی سایت جستجو میکردی نمونه های زیادی پیدا میشه ! اما شاید این پست به درد بقیه بخوره !
میتونی از این کلاس استفاده کنی :


class SimpleImage {

var $image;
var $image_type;

function load($filename) {

$image_info = getimagesize($filename);
$this->image_type = $image_info[2];
if( $this->image_type == IMAGETYPE_JPEG ) {

$this->image = imagecreatefromjpeg($filename);
} elseif( $this->image_type == IMAGETYPE_GIF ) {

$this->image = imagecreatefromgif($filename);
} elseif( $this->image_type == IMAGETYPE_PNG ) {

$this->image = imagecreatefrompng($filename);
}
}
function save($filename, $image_type=IMAGETYPE_JPEG, $compression=75, $permissions=null) {

if( $image_type == IMAGETYPE_JPEG ) {
imagejpeg($this->image,$filename,$compression);
} elseif( $image_type == IMAGETYPE_GIF ) {

imagegif($this->image,$filename);
} elseif( $image_type == IMAGETYPE_PNG ) {

imagepng($this->image,$filename);
}
if( $permissions != null) {

chmod($filename,$permissions);
}
}
function output($image_type=IMAGETYPE_JPEG) {

if( $image_type == IMAGETYPE_JPEG ) {
imagejpeg($this->image);
} elseif( $image_type == IMAGETYPE_GIF ) {

imagegif($this->image);
} elseif( $image_type == IMAGETYPE_PNG ) {

imagepng($this->image);
}
}
function getWidth() {

return imagesx($this->image);
}
function getHeight() {

return imagesy($this->image);
}
function resizeToHeight($height) {

$ratio = $height / $this->getHeight();
$width = $this->getWidth() * $ratio;
$this->resize($width,$height);
}

function resizeToWidth($width) {
$ratio = $width / $this->getWidth();
$height = $this->getheight() * $ratio;
$this->resize($width,$height);
}

function scale($scale) {
$width = $this->getWidth() * $scale/100;
$height = $this->getheight() * $scale/100;
$this->resize($width,$height);
}

function resize($width,$height) {
$new_image = imagecreatetruecolor($width, $height);
imagecopyresampled($new_image, $this->image, 0, 0, 0, 0, $width, $height, $this->getWidth(), $this->getHeight());
$this->image = $new_image;
}

}

میتونی از ImageMagick عهم استفاده کنی :
http://php.net/manual/en/imagick.scaleimage.php

chaown
سه شنبه 23 اسفند 1390, 01:27 صبح
این تابعی که گذاشتی موقعی بکار میره که من یک عکس رو دریافت کنم و بعد تغییرات رو اعمال کنم ولی من فقط یه آدرس از عکسم دارم که از دیتابیس میاد و خود عکس تویه هاست ذخیره شده .
یه چیزی مثل تابع imagick می خوام که آدرس تصویر رو دریافت کنه و تصویر رو از هاست دریافت کنه تغییرات رو اعمال کنه و عکس جدید رو ثبت کنه

رضا قربانی
سه شنبه 23 اسفند 1390, 02:03 صبح
در مورد توابع GD جستجو کنید . در همین قسمت و هم در گوگل .

موفق باشید

narsic
سه شنبه 23 اسفند 1390, 09:34 صبح
این تابعی که گذاشتی موقعی بکار میره که من یک عکس رو دریافت کنم و بعد تغییرات رو اعمال کنم ولی من فقط یه آدرس از عکسم دارم که از دیتابیس میاد و خود عکس تویه هاست ذخیره شده .
یه چیزی مثل تابع imagick می خوام که آدرس تصویر رو دریافت کنه و تصویر رو از هاست دریافت کنه تغییرات رو اعمال کنه و عکس جدید رو ثبت کنه
همین کلاس این کار رو برات انجام میده.
با کجای کلاس مشکل دارید؟

MMSHFE
سه شنبه 23 اسفند 1390, 10:54 صبح
این کد رو ببینید:


$file = &$_FILES['photo'];
if(isset($file['name']) && $file['error'] == 0 && $file['size'] < 1048576 && $file['type'] == 'image/jpeg') {
// Read original uploaded image and get it's height and width and filename without extension
$src = imagecreatefromjpeg($file['tmp_name']);
$w = imagesx($src);
$h = imagesy($src);
$fn = substr($file['name'], 0, strrpos($file['name'], '.'));
// Create 160x120 (small) thumbnail
$dst = imagecreatetruecolor(160, 120);
imagecopyresized($dst, $src, 0, 0, 0, 0, 160, 120, $w, $h);
imagejpeg($dst, 'thumbnails/'.$fn.'_s.jpg', 100);
imagedestroy($dst);
// Create 320x240 (medium) thumbnail
$dst = imagecreatetruecolor(320, 240);
imagecopyresized($dst, $src, 0, 0, 0, 0, 320, 240, $w, $h);
imagejpeg($dst, 'thumbnails/'.$fn.'_m.jpg', 100);
imagedestroy($dst);
// Create 640x480 (large) thumbnail
$dst = imagecreatetruecolor(640, 480);
imagecopyresized($dst, $src, 0, 0, 0, 0, 640, 480, $w, $h);
imagejpeg($dst, 'thumbnails/'.$fn.'_l.jpg', 100);
imagedestroy($dst);
imagedestroy($src);
// Store original uploaded image into the 'images' folder
move_uploaded_file($file['tmp_name'], 'images/'.$file['name']);
}

کد فوق، علاوه بر آپلود تصویر اصلی توی پوشه images، سه پیشنمایش از اون با ابعاد 160x120 و 320x240 و 640x480 میسازه. حالا میتونید این کد رو تغییر بدین تا قسمت آپلود رو حذف کنید و بجای دریافت اسم فایل از فایل آپلودشده، اون رو از دیتابیس بخونه و عکس رو از اونجا بارگذاری کنه (توی تابع imagecreatefromjpeg). موفق باشید.

chaown
سه شنبه 23 اسفند 1390, 16:27 عصر
ببینید این کدهایی که شما می فرستید که البته دستتون درد نکنه ، برای زمانی بدرد می خوره که من بخوام یه عکس رو لود کنم و همون موقع ازش thumbnails درست کنیم.
اما من می خوام یه عکس رو لود کنم تویه هاست و آدرسش رو تویه یه فیلد تو دیتابیس قرار بدم و هر وقت خواستم ازش استفاده کنم اون رو با یه تگ img لود کنم البته با حجم و اندازه های مختلف

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

من فکر می کنم فیسبوک یکبار یک عکس رو لود میکنه و در قسمت های مختلف با اندازه های مختلف نمایش داده می شه

MMSHFE
سه شنبه 23 اسفند 1390, 17:03 عصر
نه عزیز، فیسبوک عکسها رو با اسکریپت میسازه. یعنی هرجا لازم باشه، آدرس عکس رو میخونه و میده به اسکریپتی که پیشنمایش رو تولید میکنه. برای مثال، این کد رو ببینید:


<?php
header('Content-Type: image/jpeg');
if(!isset($_GET['photo'])) {
exit();
}
$tw = isset($_GET['width']) && is_numeric($_GET['width']) && $_GET['width'] > 0 ? $_GET['width'] : 100;
$th = isset($_GET['height']) && is_numeric($_GET['height']) && $_GET['height'] > 0 ? $_GET['height'] : 100;
$photo = 'images/'.$_GET['photo'];
if(file_exists($photo)) {
$src = imagecreatefromjpeg($photo);
$w = imagesx($src);
$h = imagesy($src);
$dst = imagecreatetruecolor($tw, $th);
imagecopyresized($dst, $src, 0, 0, 0, 0, $tw, $th, $w, $h);
imagejpeg($dst);
imagedestroy($dst);
imagedestroy($src);
}
exit();
?>

برای استفاده از این اسکریپت، باید آدرس عکس و پهنا و ارتفاع دلخواه رو بهش بدین و اگه آدرس تنها رو بدین، پیشنمایش 100x100 پیکسل بهتون میده. روش استفاده (با فرض اینکه اسکریپت فوق رو به نام thumb.php ذخیره کرده باشین) :


<img src="thumb.php?photo=profile.jpg&width=320&height=240"/>
<!-- or -->
<img src="thumb.php?photo=flower.jpg"/>

که روش اول باعث تولید پیشنمایش با ابعاد 320x240 از فایل profile.jpg در پوشه images میشه و روش دوم پیشنمایش 100x100 از تصویر flower.jpg ایجاد میکنه.
امتیاز این روش اینه که فقط یک فایل عکس داریم و هرجا لازم باشه، یک نسخه با سایز مناسب ازش تولید و نمایش داده میشه. ضمناً میشه کارهای بیشتر و جالبتری هم انجام داد. مثلاً Referer رو چک کنید تا اگه صفحه ای که عکس رو درخواست کرده، توی سایت خودتون نبود، عکس رو نشون ندین. اینطوری جلوی Hotlinking رو هم میگیرین و بقیه نمیتونن عکسها سایت شما رو توی سایت خودشون کپی کنن. حتی میتونید درصورتی که Referer از سایت خود شما نبود، با دستور header، کاربر رو به سایت خودتون Redirect کنید! موفق باشید.
موفق باشید.

chaown
سه شنبه 23 اسفند 1390, 17:30 عصر
یه سوال
تابع imagecopyresized فقط با header('Content-Type: image/jpeg'); کار می کنه؟

MMSHFE
سه شنبه 23 اسفند 1390, 17:35 عصر
نه، تابع اولی یک کپی از تصویر اصلی همراه با تغییر اندازه ایجاد میکنه و تابع دومی که نوشتین، به مرورگر اعلام میکنه خروجی این اسکریپت از نوع عکس JPEG هست تا باهاش مثل یک عکس رفتار کنه. درواقع اگه اون رو نگذارین، نمیشه از این اسکریپت بعنوان src یک تگ img استفاده کنید. مثل اسکریپت اولی که گذاشتم و فقط پیشنمایش تولید و توی فایل ذخیره میکرد ولی نشون نمیداد. موفق باشید.