Jump to content
php.lv forumi

Bildes izmēru korigēšana


raivis

Recommended Posts

nē es jau neko nesaku, bet te izkausās pēc vienas vieīgas klaigāšanas. tu esi apskatījies, kā samazina bildes? ar ko to dara, kas tam vajadzīgs?

jeb varbūt nākamais jautājums būs - a kā izdarīt to...

 

apskaties GD bilbiotēku un tur funkcijas, kas saistītas ar image

http://lv.php.net/manual/en/ref.image.php

 

getimagesize -- Get the size of an image

imagecreate -- Create a new palette based image

imagedestroy -- Destroy an image

imagecreatefromjpeg -- Create a new image from file or URL

etc

 

un lai samazinaatu bildi proporcionāli, es domāju, ka pietiks pazīmēt uz lapiņas, kā jāsamazina garums un kā platums, lai būtu proporcionāli (ja nevar citādi)

Link to comment
Share on other sites

Kur kļūda?

 

$picpath = "img/";
$filename = "bilde.jpg";

$pic_type = GetImageSize($picpath . $row["filename"]);
$img_in = ImageCreateFromJPEG($picpath . $row["filename"]);
$w = $_GET["w"];
$h = $_GET["h"];
if ($w) {
   $h = round(($w / $pic_type[0]) * $pic_type[1]);
} elseif ($h) {
   $w = round(($h / $pic_type[1]) * $pic_type[0]);
}
$img_out = @ImageCreateTrueColor($w, $h);
imagecopyresampled($img_out, $img_in, 0, 0, 0, 0, $w, $h, $pic_type[0], $pic_type[1]);
Header("Content-type: image/jpeg");
ImageJPEG($img_out);
die();

 

Man met laukā:

Warning: getimagesize(img/) [function.getimagesize]: failed to open stream: Permission denied in c:\wamp\www\samples\05\GDimage\img2.php on line 5

 

Warning: imagecreatefromjpeg(img/) [function.imagecreatefromjpeg]: failed to open stream: Permission denied in c:\wamp\www\samples\05\GDimage\img2.php on line 6

 

Warning: imagecopyresampled(): supplied argument is not a valid Image resource in c:\wamp\www\samples\05\GDimage\img2.php on line 15

 

Warning: Cannot modify header information - headers already sent by (output started at c:\wamp\www\samples\05\GDimage\img2.php:5) in c:\wamp\www\samples\05\GDimage\img2.php on line 16

 

Warning: imagejpeg(): supplied argument is not a valid Image resource in c:\wamp\www\samples\05\GDimage\img2.php on line 17

Edited by raivis
Link to comment
Share on other sites

Paldies! - atkodu pats:

<?php
//links: img3.php?s=143094.jpg&h=100 , kur s=bildes nosaukums, w=attēla platums, h=attēla augstums
// Vieta, kura atradīsies attēls
$pth = "img/" . $s;
// Noskaidrojam kāda veida attēlus atbalsta pašreizējais GD
if (imagetypes() &IMG_PNG) {
   $suport["PNG"] = true;
}
if (imagetypes() &IMG_GIF) {
   $suport["GIF"] = true;
}
if (imagetypes() &IMG_JPG) {
   $suport["JPG"] = true;
}
if (imagetypes() &IMG_WBMP) {
   $suport["BMP"] = true;
}
// Noskaidrojam visu infromāciju par rādāmo attēlu
   $pic_type = GetImageSize($pth);
// Noskaidrojam attēla tipu un iestādam,
// vai ir iespējams attēlam mainīt izmērus
if ($pic_type[2] == 2 and $suport["JPG"]) {
   $USE_RESIZE = true;
   $img_in = ImageCreateFromJPEG($pth);
} elseif ($pic_type[2] == 3 and $suport["PNG"]) {
   $USE_RESIZE = true;
   $img_in = ImageCreateFromPNG($pth);
} elseif ($pic_type[2] == 1 and $suport["GIF"]) {
   $USE_RESIZE = true;
   $img_in = ImageCreateFromGIF($pth);
} elseif ($pic_type[2] == 6 and $suport["BMP"]) {
   $USE_RESIZE = true;
   $img_in = ImageCreateFromWBMP($pth);
} else {
   $USE_RESIZE = false;
}

// Ja jaunā attēla lielums nav bijis norādīts, izvada attēlu bez izmaiņām
if (!$w and !$h) {
   $USE_RESIZE = false;
}

$w = $_GET["w"];
$h = $_GET["h"];
if ($w) {
   $h = round(($w / $pic_type[0]) * $pic_type[1]);
} elseif ($h) {
   $w = round(($h / $pic_type[1]) * $pic_type[0]);
}

if ($USE_RESIZE) {
   // Maina attēla izmērus
   // Ja iespējams kā jaunu veidojam TrueColor attēlu (GD2 un jaunāki)
   if (!$img_out = @ImageCreateTrueColor($w, $h)) {
       $img_out = ImageCreate($w, $h);
   }
   ImageCopyResized($img_out, $img_in, 0, 0, 0, 0, $w, $h, $pic_type[0], $pic_type[1]);
   // Izvadam izveidoto attēlu kā JPG
   Header("Content-type: image/jpeg");
   ImageJPEG($img_out);
} else {
   // Ja nav iespējams mainīt attēla lielumu
   // Nolasam attēlu un parādam to, tādu pašu kā ir
   $fp = fopen($pth, "rb");
   if ($pic_type and $fp) {
       header("Content-type: {$pic_type['mime']}");
       fpassthru($fp);
       exit;
   }
}
?>

Link to comment
Share on other sites

Warning: getimagesize(img/) [function.getimagesize]: failed to open stream: Permission denied in c:\wamp\www\samples\05\GDimage\img2.php on line 5

vai nu bilde tur neatrodas vai arī tev nav pieejas pie tās direktorijas..

 

Warning: imagecopyresampled(): supplied argument is not a valid Image resource in c:\wamp\www\samples\05\GDimage\img2.php on line 15

tā kā bildi neatrada, tātad nav korekts stream no kurienes ņemt datus

 

Warning: Cannot modify header information - headers already sent by (output started at c:\wamp\www\samples\05\GDimage\img2.php:5) in c:\wamp\www\samples\05\GDimage\img2.php on line 16

tā kā noticis izvads uz ekrāna (iespējams, ka kļūdas paziņojumi to radījuši), tad headrei jau nosūtīti - kā zināms, tad šamie ir jāsūta pirms jebkura izvada...

Link to comment
Share on other sites

Bet tomēr vēl neesmu ticis skaidrībā - ja man ir bilde 400x700px izmeeraa un man uz PHP vajag proporcionaali korigjeet taas izmeeru, apgriežot liekās malas, lai iekļautos izmēros: 150x50px, bet ja gadījumā $bilde neiekļaujas izmēros 150x50px, tad lai proporcionāli tā palielinās, lai iekļautos noteiktos izmēros!?

 

» bet kā?

Link to comment
Share on other sites

nu šeit nāksies nedaudz padomāt matemātiski:

ja bilde ir 15 x 30 un vajag 10 x 10, tad noteicošais faktors noteikti ir garākā mala - tātad atrodam garāko malu -> 30 un salīdzinam ar pieļaujamo

10/30=0.3 tātad bilde jāreizina ar 0.3 lai dabūtu ka viena mala ir 10, bet otra proporcionāli mazāka;

 

ja ir bilde mazāka (5x7), tad atkal ņemam lielāko malu un salīdzinam ar maksimāli pieļaujamo, t.i. 10

10/7= 1. ..., kur ar šo koeficientu pareizinam abas bildes malas...

Link to comment
Share on other sites

Jopcig! Cik tev gadu? Kāpēc tu domā, ka šeit ir bērnu krāsojamā grāmata!?!

Tev hu_ha tak pastāstīja algoritmu, tad nu arī raksti!

   # dots $x0, $y0 - bildes izmēri
   # vajag $x, $y - bildes rezultējošos izmērus
 if ($x0>$y0) {
   $aspect = $x/$x0;
   $y = $y0/$aspect;
 } else {
     # šo daļu, kad $y0<$x0 atļaušu tev pašam izdomāt!;)
 }
   # tagad $x un $y satur izmērus ne lielākus par sākotnējiem $x un $y
   # un uz kuriem mainot bildi, nemainīsies proporcijas

Edited by bubu
Link to comment
Share on other sites

Ja $x0=$y0, tad izpildīsies else daļa. Principā tādā gadījumā ir pilnīgi vienalga, kura daļa izpildās, manuprāt.

Nu lab vienīgā mana kļūda ir tas komentārs $x0<$y0 vietā jābūt <=, bet tas jau neko daudz nemaina, kā nekā - komentārs ;)

Link to comment
Share on other sites

×
×
  • Create New...