webForumDet fria alternativet

Problem med att skapa miniatyrer från mapp

PHP

8 svar · 717 visningar · startad av Guldstrand

Medlem sedan juli 20041 271 inlägg
Frågan#1

Jag använder följande kod för att skapa två olika miniatyrer (från en mapp på servern), samt för att flytta originalbilden, men något blir "knas" med vissa bilder.

function createThumbs( $pathToImages, $pathToThumbs, $thumbWidth )
{
  $dir = opendir( $pathToImages );

  while (false !== ($fname = readdir( $dir ))) {
    $info = pathinfo($pathToImages . $fname);

    if ( strtolower($info['extension']) == 'jpg')
    {

	if (stristr($info['filename'], "normal_") === FALSE && stristr($info['filename'], "thumb_") === FALSE)
	{ 

      echo "Skapar miniatyr för <b>{$fname}</b><br />";

      $img = imagecreatefromjpeg( "{$pathToImages}{$fname}" );
      $width = imagesx( $img );
      $height = imagesy( $img );

      $new_width = $thumbWidth;
      $new_height = floor( $height * ( $thumbWidth / $width ) );

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

      imagecopyresampled( $tmp_img, $img, 0, 0, 0, 0, $new_width, $new_height, $width, $height ); 

	$randFilename = uniqid("img_"); 
	$newFilename = $randFilename.".".$info['extension'];

      	imagejpeg( $tmp_img, "{$pathToThumbs}{$newFilename}", 60 ); 

	copy("{$pathToImages}{$fname}", "{$newFilename}"); 

	list($width, $height) = getimagesize("{$pathToImages}{$fname}"); 
	$storlek = filesize("{$pathToImages}{$fname}"); 

	$medlem = 1;
	$kategori = 5;
	$kommentar = sqlesc($_POST["kommentar"]); 

	$in = array("-", "_", "xxx", "cover", ".jpg", "xxx", "dvd");
	$out = array(" ", " ", "", "", "", "", "");  

   	$title = str_replace($in,$out,"" .strtolower("{$fname}"). "");

	mysql_query("INSERT INTO bilder (datum, anvandare, kategori, filnamn, titel, kommentar, bredd, hojd, storlek) 
		      VALUES(NOW(), $medlem, $kategori, '$newFilename', '$title', $kommentar, $width, $height, $storlek)") 
			or sqlerr(__FILE__, __LINE__);

    }
  } 
}
  closedir( $dir );
}
createThumbs("/uploads/","mini/",330); 
createThumbs("/uploads/","mellan/",690);

Det som händer, är att flera av de minsta bilderna (bredd 330), inte skapas alls.
Vad kan vara fel? :q

Medlem sedan juli 20041 271 inlägg
#2

*bump* (eller nått...)
:r

Medlem sedan juni 20031 837 inlägg
#3

Är det alltid samma bilder som inte skapas?
Om du kan hitta en bild som den inte skapa den lilla (330px) men den större (690px) så lägg den i en egen katalog och lägg sedan till lite med debug-kod i skriptet.
aktivera mer felmeddelande (error, warning m.m.) för skriptet.

Medlem sedan juli 20041 271 inlägg
#4

The_Hulk skrev:

Är det alltid samma bilder som inte skapas?
Om du kan hitta en bild som den inte skapa den lilla (330px) men den större (690px) så lägg den i en egen katalog och lägg sedan till lite med debug-kod i skriptet.
aktivera mer felmeddelande (error, warning m.m.) för skriptet.

Är osäker på om det är samma bilder som inte skapas varje gång.
Alla "mellanliggande" bilder verkar skapas utan problem, det är endast en del mindre bilder som inte skapas.

Är lite svårt att kontrollera vilka mindre bilder som inte skapas, då filnamnet ändras med unikt ID. :r

Medlem sedan juni 20031 837 inlägg
#5

Du kan kolla om filen finns efter att du har skapat den med funktionen file_exists http://se2.php.net/manual/en/function.file-exists.php
Lägg den i en if-stats och skriv ut något fint felmeddelande så kanske det kan hjälp att hitta vilka bilder som inte skapas. Skriv ut både det nya namnet och originalnamnet.

Medlem sedan juli 20041 271 inlägg
#6

Hmm... jag misstänker att det är det unika filnamnet som spökar.
Kan det vara så att mini -och mellanbilden får varsitt unikt id (olika), när jag hör "createThumbs" funktionen två gånger?
Om det är så, hur löser jag det?

Medlem sedan juni 20031 837 inlägg
#7

Då får du nog tänka om lite.
Gör en funktion som loopar över alla bilder och sedan en funktion som skapar själva miniatyrer. Då kan du skapa det unika/slumpmässiga namnet utanför funktionen som skapar miniatyren.
Förväntar du dig att båda bilder ska få samma namn nu?

Medlem sedan juli 20041 271 inlägg
#8

The_Hulk skrev:

Förväntar du dig att båda bilder ska få samma namn nu?

Korrekt! :r :l
Hur löser jag detta enklast med funktionen ovan?

Medlem sedan juni 20031 837 inlägg
#9

Jag har tyvärr inte kunnat testa koden så jag vet inte om allting har blivit rätt.

<?php
function createThumbs($pathToImages)
{
	$dir = opendir( $pathToImages );

	while (false !== ($fname = readdir( $dir )))
	{
		$info = pathinfo($pathToImages . $fname);

		if ( strtolower($info['extension']) == 'jpg')
		{
			if (stristr($info['filename'], "normal_") === FALSE && stristr($info['filename'], "thumb_") === FALSE)
			{ 
				$randFilename = uniqid("img_"); 
				$newFilename = $randFilename . "." . $info['extension'];
				echo "Skapar miniatyr för <b>{$fname}</b> miniatyrnamn <b>$newFilename</b><br />";

				createThumb($pathToImages . $fname, "mini/" . $newFilename, 330);
				createThumb($pathToImages . $fname, "mellan/" . $newFilename, 690);
			}
		} 
	}
	
	closedir( $dir );
}

function createThumb($imageName, $thumbName, $thumbWidth )
{
	$img = imagecreatefromjpeg($imageName);
	$width = imagesx($img);
	$height = imagesy($img);

	$new_width = $thumbWidth;
	$new_height = floor( $height * ( $thumbWidth / $width ) );
	$tmp_img = imagecreatetruecolor( $new_width, $new_height );

	imagecopyresampled( $tmp_img, $img, 0, 0, 0, 0, $new_width, $new_height, $width, $height ); 
	imagejpeg( $tmp_img, $thumbName, 60 ); 
	copy("{$pathToImages}{$fname}", "{$newFilename}"); 

	list($width, $height) = getimagesize("{$pathToImages}{$fname}"); 
	$storlek = filesize("{$pathToImages}{$fname}"); 
	$medlem = 1;
	$kategori = 5;
	$kommentar = sqlesc($_POST["kommentar"]); 

	$in = array("-", "_", "xxx", "cover", ".jpg", "xxx", "dvd");
	$out = array(" ", " ", "", "", "", "", "");  
	$title = str_replace($in,$out,"" .strtolower("{$fname}"). "");

	mysql_query("INSERT INTO bilder (datum, anvandare, kategori, filnamn, titel, kommentar, bredd, hojd, storlek) 
		VALUES(NOW(), $medlem, $kategori, '$newFilename', '$title', $kommentar, $width, $height, $storlek)") 
		or sqlerr(__FILE__, __LINE__);
}

createThumbs("/uploads/");
?>
263 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
119 ms — deklarationer (db)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)
129 ms — ändringar (db)