webForumDet fria alternativet

Strul med att göra tumnaglar...

17 svar · 1 196 visningar · startad av UrMe

UrMeMedlem sedan apr. 2001762 inlägg
#1

Hittat ett script som gör tumnaglar av .jpg filer... men får ett konstigt fel:

Warning: imagecreatefromjpeg: '/tmp/phpa23934' is not a valid JPEG file in /home2/www/urme/phptester/imageresizer/imgresizer41.php on line 172

Warning: Supplied argument is not a valid Image resource in /home2/www/urme/phptester/imageresizer/imgresizer41.php on line 239

Rad 171 & 172:

			$img = ImageCreateFromJpeg($uploaded_file); 
			$img_type = "JPG";

Rad 239:

imagecopyresized($img_resized, $img_original, 0, 0, 0, 0,$img_new_w, $img_new_h, $img_w,$img_h) or die("<br><font color=\"red\"><b>Failed to resize @ ImageCopyResized()</b></font><br>");

Det finns GD 1.6.2 på servern och PHP 4.0.6 .. vad är felet?

UrMeMedlem sedan apr. 2001762 inlägg
#2

Ingen som har nån liten idé?

PellefantMedlem sedan maj 20023 372 inlägg
#3

GD ska väl kunna göra naglar, har dock inte testat själv.

MungoMedlem sedan jan. 2000372 inlägg
#4

Jag hinner tyvärr inte göra mer än att dela med mig av de funktioner som jag alltid använder och som funkar fint för mig...

För att skala en bild, anropa scalePic(infil, utfil, max X-storlek, max Y-storlek, kvalitet (0-100));

function scalePic($filnamn, $nyttfilnamn, $maxX, $maxY, $kvalitet = 75) {
	$im = ImageCreateFromJPEG($filnamn);
	
	$im_width=imageSX($im);
	$im_height=imageSY($im);
	
	if ($maxX > $maxY) {
		$factor = $maxX/$im_width;
		$new_width = $maxX;
		$new_height = $im_height * $factor;
		}
	else {
		$factor = $maxY/$im_width;
		$new_width = $maxY;
		$new_height = $im_height * $factor;
		}
	
	// resize
	$new_im=ImageCreate($new_width,$new_height);
	ImageCopyResampleBicubic($new_im,$im,0,0,0,0,$new_width,$new_height,$im_width,$im_height);

	// output
	Imagejpeg($new_im,$nyttfilnamn,$kvalitet); // quality 75
		
	// cleanup
	ImageDestroy($im);
	ImageDestroy($new_im);
	}

	
function ImageCopyResampleBicubic ($dst_img, $src_img, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h)
/*
port to PHP by John Jensen July 10 2001 -- original code (in C, for the PHP
GD Module) by [email]jernberg@fairytale.se[/email]
*/
{
	for ($i = 0; $i < 256; $i++) {  // get pallete. Is this algoritm correct?
		$colors = ImageColorsForIndex ($src_img, $i);
		ImageColorAllocate ($dst_img, $colors['red'], $colors['green'], $colors['blue']);
	}

	$scaleX = ($src_w - 1) / $dst_w;
	$scaleY = ($src_h - 1) / $dst_h;

	$scaleX2 = $scaleX / 2.0;
	$scaleY2 = $scaleY / 2.0;

	for ($j = $src_y; $j < $dst_h; $j++) {
		$sY = $j * $scaleY;

		for ($i = $src_x; $i < $dst_w; $i++) {
			$sX = $i * $scaleX;

			$c1 = ImageColorsForIndex ($src_img, ImageColorAt ($src_img, (int) $sX, (int) $sY + $scaleY2));
			$c2 = ImageColorsForIndex ($src_img, ImageColorAt ($src_img, (int) $sX, (int) $sY));
			$c3 = ImageColorsForIndex ($src_img, ImageColorAt ($src_img, (int) $sX + $scaleX2, (int) $sY + $scaleY2));
			$c4 = ImageColorsForIndex ($src_img, ImageColorAt ($src_img, (int) $sX + $scaleX2, (int) $sY));

			$red = (int) (($c1['red'] + $c2['red'] + $c3['red'] + $c4['red']) / 4);
			$green = (int) (($c1['green'] + $c2['green'] + $c3['green'] + $c4['green']) / 4);
			$blue = (int) (($c1['blue'] + $c2['blue'] + $c3['blue'] + $c4['blue']) / 4);

			$color = ImageColorClosest ($dst_img, $red, $green, $blue); 
			ImageSetPixel ($dst_img, $i + $dst_x, $j + $dst_y, $color); 
		}
	}
}
MungoMedlem sedan jan. 2000372 inlägg
#5

...och jag gör alltid en move_uploaded_file() innan jag försöker jobba med den uppladdade bilden - det kanske är nåt du ska testa? Att jobba med kopian alltså...

UrMeMedlem sedan apr. 2001762 inlägg
#6

Jag provade Mungos funktioner... men får fortfarande

Warning: imagecreatefromjpeg: 'sony.jpg' is not a valid JPEG file in /home2/www/urme/phptester/imageresizer/resize.php on line 3

Och sedan en massa andra fel som kan vara följd fel på detta..
Nu körde jag inget upload script utan hade en fil direkt på servern. Men imagecreatefromjpeg verkar nåt lurt med.. borde väl fungera med PHP 4.0.6 och GD 1.6.2?

MungoMedlem sedan jan. 2000372 inlägg
#7

Ja, det enda jag kan tänka mig är just att det inte är en riktig JPEG-bild du försöker leka med? Har du testat med nån annan fil?

UrMeMedlem sedan apr. 2001762 inlägg
#8

japp jag har provat med flera olika filer.. gjorde även en .jpg fil i photoshop med ett par färger..

Provade denna kod:

$img = imagecreatefromjpeg("test.jpg");
echo imagecolorstotal($img);
imagedestroy($img);

Får samma felmeddelande på imagecreatefromjpeg... :(

UrMeMedlem sedan apr. 2001762 inlägg
#9

Jag har installerat Apache, php lokalt på min dator..
Php version 4.2.1 och GD 1.6.2+

Och det fungerar lokalt.. men det fungerar inte på webbservern med PHP 4.0.6 och GD 1.6.2+ ... skumt?

Nåt fel på PHP 4.0.6 versionen?

MungoMedlem sedan jan. 2000372 inlägg
#10

Skumt. Det lutar väl mot att det är nåt fel på installationen av GD på den maskinen då?

UrMeMedlem sedan apr. 2001762 inlägg
#11

Får skicka ett mail till webbhotellet jag använder och kolla... hmm.. men det är inte att de kör 4.0.6 som strular? ..

för när man kollar med phpinfo() .. så står det så här:

GD Support enabled 
GD Version 1.6.2 or higher 
JPG Support enabled 
PNG Support enabled 
WBMP Support enabled

Så det ser ju rätt ut?

CmartMedlem sedan feb. 200269 inlägg
#12

Mungo skrev:

Jag hinner tyvärr inte göra mer än att dela med mig av de funktioner som jag alltid använder och som funkar fint för mig...

För att skala en bild, anropa scalePic(infil, utfil, max X-storlek, max Y-storlek, kvalitet (0-100));

testade din kod men min blid blev alldeles blå?

nån aning om varför?

Edit: fick det att funka med imagecopyresampled istället för bara imagecreate

MungoMedlem sedan jan. 2000372 inlägg
#13

Blåbilden beror på vilken version av GD du har. Du kan köra imagecreatetruecolor() om du har rätt GD och slippa blåbilden.

CmartMedlem sedan feb. 200269 inlägg
#14

Mungo skrev:

Blåbilden beror på vilken version av GD du har. Du kan köra imagecreatetruecolor() om du har rätt GD och slippa blåbilden.

imagecreatetruecolor menar jag naturligtvis att jag ändrade till.

Finns det något mer man kan göra för att höja bildkvalitén?

Det finns 2 ställen man kan påverka kvalitén?

Ena vid function scalepic och när man anropar scalepic senare?

Hur funkar dessa?

Jag kör med php_gd2.dll, den version som följer med php 4.3.3

*erikMedlem sedan mars 200171 inlägg
#15

Förändring av bildfunktion

Underbar funktion som Mungo har delat med sig av, och den fungerar klockrent. Jag har dock ett önskemål om en liten förändring av funktionen som jag inte klarar av att fixa själv.

När man skapar sin tumnagel blir den alltid ett angivet antal pixlar bred, och det är alltid bredden som styr hur hög den blir. Det är ju bra så länge bilden man skalar om är bredare än den är hög, men jag skulle vilja att man även kan styra hur höga bilderna blir om de är högre än de är breda.

Är detta möjligt att göra en sådan förändring av funktionen. Kanske är detta en för stor utmaning vad en vanlig dödlig klarar av? :OO

MatteMedlem sedan aug. 20002 975 inlägg
#16

Här är en annan variant. Ger kvadratiska thumbnails.
Är bilderna stående tas kvadraten från övre delen av bilden, är bilderna liggande tas kvadraten från mitten av bilden.

function make_thumb($src, $dst, $dstWH=100, $quality=90) {

   if (!file_exists($src) || (is_dir($dst) && $dst != '')) {
      return false;
   }

   if ($dst == '') {
      header("Content-Disposition: inline; filename=thumb_".basename($src));
      header("Content-type: image/jpeg"); 
   }

   $info = getimagesize($src);
   switch($info[2]) {
     case 1:
       $im_src = imagecreatefromgif($src);
       break;
     case 2:
       $im_src = imagecreatefromjpeg($src);
       break;
     case 3:
       $im_src = imagecreatefrompng($src);
       break;
   }
  
   if ($info[1] >= $info[0]) {
     $srcX = 0;
     $srcY = 0;
     $srcW = $info[0];
     $srcH = $info[0];
   } else {
     $srcX = round(($info[0] - $info[1])/2);
     $srcY = 0;
     $srcW = $info[1];
     $srcH = $info[1];
   }

   // Använd dessa om du inte har stöd för GD2 
   // $img_thumb = imageCreate($dstWH, $dstWH);
   // imagecopyresized ( $img_thumb, $im_src, 0, 0, $srcX, $srcY, $dstWH, $dstWH, $srcW, $srcH );
  
   // Använd dessa om du har stöd för GD2 
   $img_thumb = imageCreateTruecolor($dstWH, $dstWH);
   imagecopyresampled ( $img_thumb, $im_src, 0, 0, $srcX, $srcY, $dstWH, $dstWH, $srcW, $srcH );

   imageJPEG($img_thumb, $dst, $quality);

   ImageDestroy($img_thumb);
   ImageDestroy($im_src);
   
   if ($dst != '') {
      return true;
   }

}
*erikMedlem sedan mars 200171 inlägg
#17

Den funktionen matte la in funkar fint, men det är inte riktigt vad jag söker. Jag skulle vilja bibehålla propetionerna på bilden oavsett om den är liggande eller stående.

jepsOMedlem sedan mars 2001484 inlägg
#18

*erik skrev:

Jag skulle vilja bibehålla propetionerna på bilden oavsett om den är liggande eller stående.

Jag har lagt till en if-sats som kontrollerar om bilden är störst på bredden eller på höjden. Sen beräknas tumnagelstorleken utifrån det.

function scalePic($filnamn, $nyttfilnamn, $maxX, $maxY, $kvalitet = 75) {
		$im = imagecreatefromjpeg($filnamn);

		$im_width=imagesx($im);
		$im_height=imagesy($im);

		if ($im_width > $im_height) {
			$new_width  = $maxX;
			$new_height = $new_width * $im_height / $im_width;
		}
		else {
			$new_height = $maxY;
			$new_width  = $new_height * $im_width / $im_height;
		}

$new_im = imagecreatetruecolor($new_width,$new_height);

etc ...
}
134 ms totalt · 3 externa anrop · v20260731065814-full.beb2e261
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)