---
title: "Strul med att göra tumnaglar..."
type: "forum-thread"
url: "https://www.webforum.nu/amne/php/74050-strul-med-att-göra-tumnaglar"
topic: "PHP"
topic_url: "https://www.webforum.nu/amne/php"
author: "UrMe"
published: "2003-04-14T10:04:37.000Z"
updated: "2004-10-10T10:44:17.000Z"
replies: 17
views: 1219
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/php/74050-strul-med-att-göra-tumnaglar"
---

# Strul med att göra tumnaglar...

## #1 — UrMe, 2003-04-14T10:04Z

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?

Permalänk: https://www.webforum.nu/p/74050

## #2 — UrMe, 2003-04-15T06:28Z

Ingen som har nån liten idé?

Permalänk: https://www.webforum.nu/p/1011017

## #3 — Pellefant, 2003-04-15T06:52Z

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

Permalänk: https://www.webforum.nu/p/1011030

## #4 — Mungo, 2003-04-15T09:47Z

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));

```php
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); 
		}
	}
}
```

Permalänk: https://www.webforum.nu/p/1011136

## #5 — Mungo, 2003-04-15T09:49Z

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

Permalänk: https://www.webforum.nu/p/1011138

## #6 — UrMe, 2003-04-15T10:07Z

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?

Permalänk: https://www.webforum.nu/p/1011158

## #7 — Mungo, 2003-04-15T11:25Z

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?

Permalänk: https://www.webforum.nu/p/1011219

## #8 — UrMe, 2003-04-15T12:02Z

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... :(

Permalänk: https://www.webforum.nu/p/1014143

## #9 — UrMe, 2003-04-15T12:05Z

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?

Permalänk: https://www.webforum.nu/p/1014147

## #10 — Mungo, 2003-04-15T12:05Z

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

Permalänk: https://www.webforum.nu/p/1014148

## #11 — UrMe, 2003-04-15T12:13Z

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?

Permalänk: https://www.webforum.nu/p/1014160

## #12 — Cmart, 2003-09-05T09:31Z

> **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

Permalänk: https://www.webforum.nu/p/1148369

## #13 — Mungo, 2003-09-05T10:31Z

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.

Permalänk: https://www.webforum.nu/p/1148414

## #14 — Cmart, 2003-09-05T19:12Z

> **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

Permalänk: https://www.webforum.nu/p/1148794

## #15 — *erik, 2004-01-19T14:47Z

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

Permalänk: https://www.webforum.nu/p/1254731

## #16 — Matte, 2004-01-19T15:30Z

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.

```php
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;
   }

}
```

Permalänk: https://www.webforum.nu/p/1254766

## #17 — *erik, 2004-01-20T11:44Z

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.

Permalänk: https://www.webforum.nu/p/1255220

## #18 — jepsO, 2004-10-10T10:44Z

> **\*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.

```php
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 ...
}
```

Permalänk: https://www.webforum.nu/p/1457670

---

Tråden på webben: https://www.webforum.nu/amne/php/74050-strul-med-att-göra-tumnaglar
