PHP veya JS ile resim yüklerken orantılı küçültme
Ben php de veritabanına görsel yollarken o resmi orantılı küçültmek ve küçülttüğüm resmi hem veri tabanına hemde bir klasöre kaydetmek istiyorum. Nasıl yapabilirim?
Soru hatalı mı? 👎
Eğer sorunun kurallara aykırı olduğunu düşünüyorsanız lütfen bize bildirin!
Cevaplar (8)
Merhabalar @codepacks. Klasöre yolladığım resmin adını veritabanına atacak bir kod var mı elinizde?
buyur burdan indir kayıt veritabanı
vesaire hepsini düzenledim sıfırdan test ettim
kodlar ve sql dahil
link
https://www108.zippyshare.com/v/tsjjl6qV/file.html
Merhabalar @codepacks. İlginiz için teşekkür ederim. Yaptığınız kod çalışıyor fakat resmin quality'sini %100 yapmama rağmen görünmeyecek halde bozuyor.
Aldığım çıktı şu şekilde: https://prnt.sc/35C8KU80fumL
Resmin orjinali: https://prnt.sc/2gytP5_LmFU4
Ayrıca Dosayı küçültünce çıkan hatam:
Warning: Undefined variable $file_ext in C:\xampp\htdocs\photo\upload.php on line 34
Warning: Undefined variable $file_ext in C:\xampp\htdocs\photo\upload.php on line 37
Warning: Undefined variable $file_ext in C:\xampp\htdocs\photo\upload.php on line 40
Warning: Undefined variable $file_ext in C:\xampp\htdocs\photo\upload.php on line 43
Warning: Undefined variable $file_ext in C:\xampp\htdocs\photo\upload.php on line 50
Warning: Undefined variable $file_ext in C:\xampp\htdocs\photo\upload.php on line 54
Warning: Undefined variable $file_ext in C:\xampp\htdocs\photo\upload.php on line <57></57>
KODUM:
<?php
$file_name= str_replace(" ","-",$_FILES['resim']['name']);
$resim=rand(0,99999)."_".$file_name;
//orjinal halinde kayıt yeri (images/)
$tpath1='images/'.$resim;
$pic1=compress_image($_FILES["resim"]["tmp_name"], $tpath1, 90);
//kırpılmış halinde kayıt yeri
$thumbpath='images/small/'.$resim;
$thumb_pic1=create_thumb_image($tpath1,$thumbpath,'470','260'); // kaydedilecek resim boyutu değiştirilebilir
$file_name= str_replace(" ","-",$_FILES['resim']['name']);
$resim_cover=rand(0,99999)."_".$file_name;
function compress_image($source_url, $destination_url, $quality) {
$info = getimagesize($source_url);
if ($info['mime'] == 'image/jpeg')
$image = imagecreatefromjpeg($source_url);
elseif ($info['mime'] == 'image/gif')
$image = imagecreatefromgif($source_url);
elseif ($info['mime'] == 'image/png')
$image = imagecreatefrompng($source_url);
imagejpeg($image, $destination_url, $quality);
return $destination_url;
}
function create_thumb_image($target_folder ='',$thumb_folder = '', $thumb_width = '',$thumb_height = ''){
$target_path = $target_folder;
$thumb_path = $thumb_folder;
$thumbnail = $thumb_path;
$upload_image = $target_path;
list($width,$height) = getimagesize($upload_image);
$thumb_create = imagecreatetruecolor($thumb_width,$thumb_height);
switch($file_ext){
case 'jpg':
$source = imagecreatefromjpeg($upload_image);
break;
case 'jpeg':
$source = imagecreatefromjpeg($upload_image);
break;
case 'png':
$source = imagecreatefrompng($upload_image);
break;
case 'gif':
$source = imagecreatefromgif($upload_image);
break;
default:
$source = imagecreatefromjpeg($upload_image);
}
imagecopyresized($thumb_create, $source, 0, 0, 0, 0, $thumb_width, $thumb_height, $width,$height);
switch($file_ext){
case 'jpg' || 'jpeg':
imagejpeg($thumb_create,$thumbnail,100);
break;
case 'png':
imagepng($thumb_create,$thumbnail,100);
break;
case 'gif':
imagegif($thumb_create,$thumbnail,100);
break;
default:
imagejpeg($thumb_create,$thumbnail,100);
}
}
Bu konuda ne yapabilirim?
Merhabalar @ebykdrms. Tekrardan ilgilendiğiniz için minnetarım. Kodunuzu olduğu gibi aldım, kütüphanemi kurdum ve veritabanı bağlantımı gerçekleştirdim. Ancak elde olan ty-catch blokların ıkaldırsam jda kaldırmasam da ütüpahnemdeki çektirdiğim WideImge.php dosyamda hata oluşuyor. Neden olduğun uanlayamadım
HATAM: {"type":"error","message":"Dosya bulunamad\u0131."}
Kdoum İse:
<?php
// Bu sayfayı json sonuç dönecek bir sayfa gibi düşünerek,
// kolay sonuç döndürmek için birkaç fonksiyon yazıyorum.
function sendJson($type, $message='') {
header('Content-Type: application/json; charset=utf-8');
echo json_encode(["type"=>$type, "message"=>$message]);
exit();
}
function sendError($message='') { sendJson("error", $message); }
function sendSuccess($message='') { sendJson("success", $message); }
// İşlemler buradan sonra başlıyor...
if(!isset($_FILES['my_file'])) sendError("Dosya bulunamadı.");
$fileName = $_FILES['my_file']['name'];
$fileSize = $_FILES['my_file']['size'];
$fileTmpName = $_FILES['my_file']['tmp_name'];
$fileType = $_FILES['my_file']['type'];
$fileExtension = explode('.',$fileName);
$fileExtension = end($fileExtension);
$fileExtension = strtolower($fileExtension);
if (!in_array($fileExtension,['jpeg','jpg','png'])) sendError('Dosya uzantısı geçersiz. Lütfen jpg veya png dosya seçin');
if ($fileSize > 4 1024 1024) sendError('Dosya boyutu 4 mb üzerinde olamaz.');
$bigImagePath = 'images/'.$fileName; // Bu php dosyasının olduğu aynı yerde images klasörü de olmalı.
$smallImagePath = 'images/small/'.$fileName; // Bu php dosyasının olduğu aynı yerdeki images klasörü altında small klasörü de olmalı.
$uploaded = move_uploaded_file($fileTmpName, $bigImagePath);
if(!$uploaded) sendError('Dosya kaydedilemedi.');
include "wideimage/lib/WideImage.php"; // Bu php dosyasının olduğu aynı yerde libraries klasörü de olmalı. İçine de WideImage.php dosyası eklenmiş olmalı.
$bigImage = WideImage::load($bigImagePath);
$smallImage = WideImage::load($bigImagePath);
$bigImage = WideImage::load($bigImagePath);
$smallImage = WideImage::load($bigImagePath);
$bigImageResized = $bigImage->resize(1000, 1000, 'inside'); // Görseli 1000x1000 piksellik alana sığacak şekilde boyutlandırır.
$smallImageResized = $smallImage->resize(300, 300, 'inside'); // Görseli 300x300 piksellik alana sığacak şekilde boyutlandırır.
try {
$bigImageResized->saveToFile($bigImagePath);
$smallImageResized->saveToFile($smallImagePath);
}
catch (Exception $e) { sendError("Görsel boyutlandırma başarısız oldu."); }
$db = null;
try { $db = new PDO("mysql:host=localhost;dbname=lpanel;charset=utf8", "root", ""); }
catch ( PDOException $e ){ sendError("Veritabanına bağlanılamadı."); }
$query = $db->prepare("INSERT INTO posts SET image_url = :fileName");
$insert = $query->execute(["fileName"=>$fileName]);
if(!$insert) sendError("Görsel adı veritabanına yazılamadı.");
sendSuccess("Görsel başarıyla kaydedildi.");
?>
Yardımcı olabilirseniz sevinirim
Selam yardımcı olayım size sistemimde kullanmış olduğum kodlar
resim düzenini korumak,kırpmak ve farklı bir klasöre kayıt etmek için
gereken php forum kayıt örneği
orjinal resimler images/ adında bir dosya içerisine kayıt edilir
kırpılmış resimler images/thumbs/ dosya içerisine kayıt edilir
kayıt yerini yeniden isimlendirebilirsin
php kayıt formu içindeki php kodlar
$file_name= str_replace(" ","-",$_FILES['resim']['name']);
$resim=rand(0,99999)."_".$file_name;
//orjinal halinde kayıt yeri (images/)
$tpath1='images/'.$resim;
$pic1=compress_image($_FILES["resim"]["tmp_name"], $tpath1, 90);
//kırpılmış halinde kayıt yeri
$thumbpath='images/thumbs/'.$resim;
$thumb_pic1=create_thumb_image($tpath1,$thumbpath,'270','390'); // kaydedilecek resim boyutu değiştirilebilir
$file_name= str_replace(" ","-",$_FILES['resim_cover']['name']);
$resim_cover=rand(0,99999)."_".$file_name;
fonksiyon örneği
function compress_image($source_url, $destination_url, $quality) {
$info = getimagesize($source_url);
if ($info['mime'] == 'image/jpeg')
$image = imagecreatefromjpeg($source_url);
elseif ($info['mime'] == 'image/gif')
$image = imagecreatefromgif($source_url);
elseif ($info['mime'] == 'image/png')
$image = imagecreatefrompng($source_url);
imagejpeg($image, $destination_url, $quality);
return $destination_url;
}
function create_thumb_image($target_folder ='',$thumb_folder = '', $thumb_width = '',$thumb_height = ''){
$target_path = $target_folder;
$thumb_path = $thumb_folder;
$thumbnail = $thumb_path;
$upload_image = $target_path;
list($width,$height) = getimagesize($upload_image);
$thumb_create = imagecreatetruecolor($thumb_width,$thumb_height);
switch($file_ext){
case 'jpg':
$source = imagecreatefromjpeg($upload_image);
break;
case 'jpeg':
$source = imagecreatefromjpeg($upload_image);
break;
case 'png':
$source = imagecreatefrompng($upload_image);
break;
case 'gif':
$source = imagecreatefromgif($upload_image);
break;
default:
$source = imagecreatefromjpeg($upload_image);
}
imagecopyresized($thumb_create, $source, 0, 0, 0, 0, $thumb_width, $thumb_height, $width,$height);
switch($file_ext){
case 'jpg' || 'jpeg':
imagejpeg($thumb_create,$thumbnail,90);
break;
case 'png':
imagepng($thumb_create,$thumbnail,90);
break;
case 'gif':
imagegif($thumb_create,$thumbnail,90);
break;
default:
imagejpeg($thumb_create,$thumbnail,90);
}
}
Söylediğiniz şekilde yapabilirsiniz. Üzerinden 2 gün geçtiği için önceki cevabımı güncelleyemiyorum. try-catch içinde bir hata alıyorsunuz ama şu an ne olduğunu bilemiyoruz. Hatayı görmek için try-catch bloğunu kaldırabilirsiniz.
Görseli PHP ile boyutlandırmak için örnek
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="file" name="my_file">
<button type="submit">Yükle</button>
</form>
Butona basıldığında seçilen görsel upload.php sayfasına "my_file" key'iyle gönderilecek.
upload.php sayfasında yakalayıp kaydedin.
WideImage: wideimage.sourceforge.net
// Bu sayfayı json sonuç dönecek bir sayfa gibi düşünerek,
// kolay sonuç döndürmek için birkaç fonksiyon yazıyorum.
function sendJson($type, $message='') {
header('Content-Type: application/json; charset=utf-8');
echo json_encode(["type"=>$type, "message"=>$message]);
exit();
}
function sendError($message='') { sendJson("error", $message); }
function sendSuccess($message='') { sendJson("success", $message); }
// İşlemler buradan sonra başlıyor...
if(!isset($_FILES['my_file'])) sendError("Dosya bulunamadı.");
$fileName = $_FILES['my_file']['name'];
$fileSize = $_FILES['my_file']['size'];
$fileTmpName = $_FILES['my_file']['tmp_name'];
$fileType = $_FILES['my_file']['type'];
$fileExtension = explode('.',$fileName);
$fileExtension = end($fileExtension);
$fileExtension = strtolower($fileExtension);
if (!in_array($fileExtension,['jpeg','jpg','png'])) sendError('Dosya uzantısı geçersiz. Lütfen jpg veya png dosya seçin');
if ($fileSize > 4 * 1024 * 1024) sendError('Dosya boyutu 4 mb üzerinde olamaz.');
$bigImagePath = 'images/'.$fileName; // Bu php dosyasının olduğu aynı yerde images klasörü de olmalı.
$smallImagePath = 'images/small/'.$fileName; // Bu php dosyasının olduğu aynı yerdeki images klasörü altında small klasörü de olmalı.
$uploaded = move_uploaded_file($fileTmpName, $bigImagePath);
if(!$uploaded) sendError('Dosya kaydedilemedi.');
include "libraries/WideImage.php"; // Bu php dosyasının olduğu aynı yerde libraries klasörü de olmalı. İçine de WideImage.php dosyası eklenmiş olmalı.
$bigImage = WideImage::load($bigImagePath);
$smallImage = WideImage::load($bigImagePath);
$bigImage = WideImage::load($bigImagePath);
$smallImage = WideImage::load($bigImagePath);
$bigImageResized = $bigImage->resize(1000, 1000, 'inside'); // Görseli 1000x1000 piksellik alana sığacak şekilde boyutlandırır.
$smallImageResized = $smallImage->resize(300, 300, 'inside'); // Görseli 300x300 piksellik alana sığacak şekilde boyutlandırır.
try {
$bigImageResized->saveToFile($bigImagePath);
$smallImageResized->saveToFile($smallImagePath);
}
catch (Exception $e) { sendError("Görsel boyutlandırma başarısız oldu."); }
$db = null;
try { $db = new PDO("mysql:host=localhost;dbname=test;charset=utf8", "root", "123456"); }
catch ( PDOException $e ){ sendError("Veritabanına bağlanılamadı."); }
$query = $db->prepare("INSERT INTO gorseller SET dosya_adi = :fileName");
$insert = $query->execute(["fileName"=>$fileName]);
if(!$insert) sendError("Görsel adı veritabanına yazılamadı.");
sendSuccess("Görsel başarıyla kaydedildi.");
@ebykdrms merhabalar yazınızı okudum ve minnettarım. Dediklerinizi uyguladım WideImage'i kurdum ve veri tabanıma bağlantımı gerçekleştirdim. Fakat dosyayı upload ettiğim zaman: 1= $fileExtension = strtolower(end(explode('.',$fileName))); satırından ("Only variables should be passed by reference in") hatsanı ve aynı sayfada {"type":"error","message":"G\u00f6rsel upload edilememiş."} hatasını almaktayım. 1. hatayı internetten bulduğum bir yolla $tmp = explode('.', $filename);
$fileExtension = end($tmp); şeklinde düzelttim doğru bir yöntem midir? ama hala {"type":"error","message":"G\u00f6rsel upload edilememiş."} hatasına sahibim. (SANIRIM HATANIN KAYNAĞI images/small/ KLASÖRÜNE GÖRSEL ATMAMASINDAN KAYNAKLI). Yardımcı olabilirseniz sevinirim.
Görseli PHP ile boyutlandırmak için örnek
1. Google'a "image library php" yazdığımda karşıma "PHP'de görüntü işlemek için en iyi 5 kütüphane" başlıklı bir yazı çıktı:
designbolts.com/2021/02/04/top-5-libraries-for-image-processing-in-php
2. Bu sayfada incelediğim kütüphaneler içinde biri gözüme kolay göründü: WideImage
wideimage.sourceforge.net
3. Diyelim ki şöyle bir form'dan PHP'ye görseli aktarıyorsunuz:
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="file" name="my_file">
<button type="submit">Yükle</button>
</form>
Butona basıldığında seçilen görsel upload.php sayfasına "my_file" key'iyle gönderilecek.
4. Görseli upload.php sayfasında yakalayıp kaydedin.
// Bu sayfayı json sonuç dönecek bir sayfa gibi düşünerek,
// kolay sonuç döndürmek için birkaç fonksiyon yazıyorum.
function sendJson($type, $message='') {
header('Content-Type: application/json; charset=utf-8');
echo json_encode(["type"=>$type, "message"=>$message]);
exit();
}
function sendError($message='') { sendJson("error", $message); }
function sendSuccess($message='') { sendJson("success", $message); }
// İşlemler buradan sonra başlıyor...
if(!isset($_FILES['my_file'])) sendError("Dosya bulunamadı.");
$fileName = basename($_FILES['my_file']['name']);
$fileSize = $_FILES['my_file']['size'];
$fileTmpName = $_FILES['my_file']['tmp_name'];
$fileType = $_FILES['my_file']['type'];
$fileExtension = strtolower(end(explode('.',$fileName)));
if (!in_array($fileExtension,['jpeg','jpg','png'])) sendError('Dosya uzantısı geçersiz. Lütfen jpg veya png dosya seçin');
if ($fileSize > 4 * 1024 * 1024) sendError('Dosya boyutu 4 mb üzerinde olamaz.');
$bigImagePath = 'images/'.$fileName; // Bu php dosyasının olduğu aynı yerde images klasörü de olmalı.
$smallImagePath = 'images/small/'.$fileName; // Bu php dosyasının olduğu aynı yerdeki images klasörü altında small klasörü de olmalı.
$uploaded = move_uploaded_file($fileTmpName, $bigImagePath);
if(!$uploaded) sendError('Dosya kaydedilemedi.');
5. WideImage kütüphanesini kullanarak görseli yeniden boyutlandırın ve ilgili klasörlerine kaydedin.
//... önceki kodlardan devam
include "libraries/WideImage.php"; // Bu php dosyasının olduğu aynı yerde libraries klasörü de olmalı. İçine de WideImage.php dosyası eklenmiş olmalı.
$bigImage = null;
$smallImage = null;
try {
$bigImage = WideImage::load($bigImagePath);
$smallImage = WideImage::load($bigImagePath);
}
catch (Exception $e) { sendError("Görsel upload edilememiş."); }
$bigImage = WideImage::load($bigImagePath);
$smallImage = WideImage::load($bigImagePath);
$bigImageResized = $bigImage->resize(1000, 1000, 'inside'); // Görseli 1000x1000 piksellik alana sığacak şekilde boyutlandırır.
$smallImageResized = $smallImage->resize(300, 300, 'inside'); // Görseli 300x300 piksellik alana sığacak şekilde boyutlandırır.
try {
$bigImageResized->saveToFile($bigImagePath);
$smallImageResized->saveToFile($smallImagePath);
}
catch (Exception $e) { sendError("Görsel boyutlandırma başarısız oldu."); }
Kodları test etmeden direkt buraya yazdım. WideImage sınıfını da hiç kullanmadım. Umarım bu şekilde çalışır.
6. Görseli değil, görselin ismini veritabanına kaydedin.
Görselin adı $fileName
değişkeninde bulunuyor. Veritabanına bağlanmak için kullanıyorsunuz bilmiyorum. PDO için örnek vereyim:
//...önceki kodlardan devam
$db = null;
try { $db = new PDO("mysql:host=localhost;dbname=test;charset=utf8", "root", "123456"); }
catch ( PDOException $e ){ sendError("Veritabanına bağlanılamadı."); }
$query = $db->prepare("INSERT INTO gorseller SET dosya_adi = :fileName");
$insert = $query->execute(["fileName"=>$fileName]);
if(!$insert) sendError("Görsel adı veritabanına yazılamadı.");
sendSuccess("Görsel başarıyla kaydedildi.");
Bu örneklerin yardımcı olacağını sanıyorum.
Eğer yanlış yazdığım bir yer bulursanız lütfen belirtin, bu gönderimi düzenleyeyim.