PDA

View Full Version : سوال: تغییر پسوند عکس هنگام آپلود (حل شد)



yeksib
جمعه 13 بهمن 1391, 11:08 صبح
سلام ،میخواستم ببینم چطوری میتونم تمامی تصاویری که کاربر آپلود میکنه رو در حال آپلود پسوندشون رو تغییر بدم.یعنی مثلا همه ی تصاویر با پسوند jpg ذخیره بشوند.
البته از کلاسی که توی همین سایت معرفی شده هم استفاده کردم !عیبش اینه که کیفیت عکس رو خیلی پایین میاره؟
دوستان راهکار تازه ای سراغ دارند؟

tehro0n
جمعه 13 بهمن 1391, 16:15 عصر
شما کلا تو حالت عادی هم امتحان کنی و پسوند عکس رو مثلا از png به gif تغییر بدی کیفیتش میاد پایین، اگه مشکلت اینه که من راه حلی ندارم!

MMSHFE
جمعه 13 بهمن 1391, 16:20 عصر
موقعی که از تابع imagejpeg استفاده میکنید تا فایل رو ذخیره کنید، پارامتر سوم که اختیاری هست رو 100 بگذارین ببینید کیفیت بهتره میشه یا نه؟ ضمناً برای تغییر فرمت عکس بهتره از تابع imagecopyresampled استفاده کنید.

yeksib
جمعه 13 بهمن 1391, 17:02 عصر
موقعی که از تابع imagejpeg استفاده میکنید تا فایل رو ذخیره کنید، پارامتر سوم که اختیاری هست رو 100 بگذارین ببینید کیفیت بهتره میشه یا نه؟ ضمناً برای تغییر فرمت عکس بهتره از تابع imagecopyresampled استفاده کنید.

من از این تابعی که استفاده میکنم مطمئن نیستم همون تابعی است که شما میفرمایید ؛ لطف کنید تابع خودتون رو برام بزارید خیلی ازتون ممنون میشم!

MMSHFE
جمعه 13 بهمن 1391, 17:22 عصر
این کد رو امتحان کنید:


if(isset($_FILES['photo']['name']) && $_FILES['photo']['error'] == 0) {
$photo = &$_FILES['photo'];
switch(strtolower($photo['type'])) {
case 'image/gif':
$src = ImageCreateFromGIF($photo['tmp_name']);
break;
case 'image/jpeg':
$src = ImageCreateFromJPEG($photo['tmp_name']);
break;
case 'image/png':
$src = ImageCreateFromPNG($photo['tmp_name']);
ImageAlphaBlending($src, false);
ImageSaveAlpha($src, true);
break;
case 'image/bmp':
$src = ImageCreateFromWBMP($photo['tmp_name']);
break;
default:
exit();
break;
}
$dst = ImageCreateTrueColor(ImageSX($src), ImageSY($src));
$white = ImageColorAllocate($dst, 255, 255, 255);
ImageFilledRectangle($dst, 0, 0, ImageSX($src), ImageSY($src), $white);
ImageCopyResampled($dst, $src, 0, 0, 0, 0, ImageSX($src), ImageSY($src), ImageSX($src), ImageSY($src));
ImageJPEG($dst, 'upload/' . substr($photo['name'], 0, strrpos($photo['name'], '.')) . '.jpg', 100);
ImageDestroy($dst);
ImageDestroy($src);
}

yeksib
جمعه 13 بهمن 1391, 17:48 عصر
این کد رو امتحان کنید...

خوب الان این تابع عکس رو با چه پسوندی ذخیره میکنه !؟ و کجا ذخیره میکنه؟ واصلا میشه باهاش اسم تصاویر موقع آپلود رو تغییر داد!؟
متشکرم

MMSHFE
جمعه 13 بهمن 1391, 18:49 عصر
شرمنده یادم رفته بود پسوند رو اضافه کنم. کد رو اصلاح کردم. الآن این کد با همون اسم اصلی ولی با پسوند jpg. ذخیره میکنه. اگه دوست داشتین، میتونید توی پارامتر دوم تابع ImageJPEG اسم دلخواه خودتون رو بگذارین.

yeksib
جمعه 13 بهمن 1391, 19:38 عصر
شرمنده یادم رفته بود پسوند رو اضافه کنم. کد رو اصلاح کردم. الآن این کد با همون اسم اصلی ولی با پسوند jpg. ذخیره میکنه. اگه دوست داشتین، میتونید توی پارامتر دوم تابع ImageJPEG اسم دلخواه خودتون رو بگذارین.

فقط یک مشکلی داره که پسوندهای png رو نمی شناسه و آپلود نمیکنه؟
چرا؟

MMSHFE
جمعه 13 بهمن 1391, 19:48 عصر
شرمنده اشتباهی توی case مربوط به PNG تابع ImageCreateFromJPEG رو نوشته بودم. حواس پرتیهای سر پیریه دیگه ببخشید. راستش کد رو همینجوری تو Notepad نوشتم و اصلاً تست هم نکردم. case ها رو کپی کردم و این یکی از دستم در رفت که تغییرش بدم. کد رو اصلاح کردم. موفق باشید.

yeksib
جمعه 13 بهمن 1391, 20:02 عصر
شرمنده اشتباهی توی case مربوط به PNG تابع ImageCreateFromJPEG رو نوشته بودم. حواس پرتیهای سر پیریه دیگه ببخشید. راستش کد رو همینجوری تو Notepad نوشتم و اصلاً تست هم نکردم. case ها رو کپی کردم و این یکی از دستم در رفت که تغییرش بدم. کد رو اصلاح کردم. موفق باشید.

البته یک مشکل جزئی دیگه داره ، اینه که تصاویری که ترانسپارنت هستند یعنی پشت تصویر خالیه وقتی آپلود میکنه پشت تصویر سیاه میشه؟
میشه جلوی این کار رو گرفت؟!

MMSHFE
جمعه 13 بهمن 1391, 20:09 عصر
این دستور رو توی case مربوط به PNG قبل از break بگذارین ببینید درست میشه یا نه؟

ImageSaveAlpha($src, true);
البته طبیعتاً نباید انتظار داشته باشین transparency توی JPEG حفظ بشه چون کانال آلفا نداره ولی حداقل زمینه مشکی باید حذف بشه و بجاش فکر کنم سفید میاد.

yeksib
جمعه 13 بهمن 1391, 20:12 عصر
این دستور رو توی case مربوط به PNG قبل از break بگذارین ببینید درست میشه یا نه؟

ImageSaveAlpha($src, true);
البته طبیعتاً نباید انتظار داشته باشین transparency توی JPEG حفظ بشه چون کانال آلفا نداره ولی حداقل زمینه مشکی باید حذف بشه و بجاش فکر کنم سفید میاد.

خیر هیچ فرقی نکرد و همچنان سیاه است!

MMSHFE
جمعه 13 بهمن 1391, 20:15 عصر
با false چطور؟ دقت کنید که این دستور باید بعد از ImageCreateFromPNG بیاد.

yeksib
جمعه 13 بهمن 1391, 20:17 عصر
با false چطور؟ دقت کنید که این دستور باید بعد از ImageCreateFromPNG بیاد.

خیر باز هم هیچ فرقی نکرد!

MMSHFE
جمعه 13 بهمن 1391, 20:26 عصر
این کد آخری که گذاشتم رو تست کنید.

MMSHFE
جمعه 13 بهمن 1391, 20:30 عصر
ببینید کلاً نمیشه Transparency رو توی JPG آورد چون کانال آلفا نداره. الآن من پس زمینه مشکی رو سفید کردم. ببینید مشکل رفع میشه یا نه.

yeksib
جمعه 13 بهمن 1391, 20:31 عصر
این کد آخری که گذاشتم رو تست کنید.
متاسفانه هیچ فرقی نکرد!
شما هم تو زحمت افتادید.:خجالت:

MMSHFE
جمعه 13 بهمن 1391, 20:34 عصر
یعنی پس زمینه هم سفید نشد؟ کد رو دوباره تست کنید، بعد از پستی که گفتم دوباره چک کنید، سریع کد رو دوباره اصلاح کردم ولی ننوشتم که دوباره چک کنید. الآن باید پس زمینه سفید شده باشه.

yeksib
جمعه 13 بهمن 1391, 20:46 عصر
یعنی پس زمینه هم سفید نشد؟ کد رو دوباره تست کنید، بعد از پستی که گفتم دوباره چک کنید، سریع کد رو دوباره اصلاح کردم ولی ننوشتم که دوباره چک کنید. الآن باید پس زمینه سفید شده باشه.
بله درست شد !
متشکرم

eshpilen
جمعه 13 بهمن 1391, 21:07 عصر
مهندس خوشم میاد از کدنویسیت.
ضمنا این تبدیل و بقول شما عبور دادن تصویر از کتابخانهء مربوطه، واسه امنیت هم خیلی مفیده.
یعنی هر کد مخربی اگر توی فایل گذاشته باشن اینطوری از بین میره.
البته این میتونه روش دور زدن هم داشته باشه، ولی باید بگم در دنیا افراد کمی میتونن چنین دانش و مهارتی رو داشته باشن، و تازه اونم معلوم نیست حتما بشه.