v2.5.2
Giriş yap

PHP veya JS ile resim yüklerken orantılı küçültme

ilkertuncer
604 defa görüntülendi ve 2 kişi tarafından değerlendirildi

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?

Cevap yaz
Cevaplar (8)
ilkertuncer
989 gün önce

Merhabalar @codepacks. Klasöre yolladığım resmin adını veritabanına atacak bir kod var mı elinizde?

codepacks
989 gün önce

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

ilkertuncer
989 gün önce

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?

ilkertuncer
989 gün önce

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

codepacks
989 gün önce

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);
		}
   }
ebykdrms
989 gün önce

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.");
ilkertuncer
989 gün önce

@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.

ebykdrms
992 gün önce

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.