webForumDet fria alternativet

Göra thumbnails!

17 svar · 1 000 visningar · startad av streetrobban

streetrobbanMedlem sedan jan. 20011 140 inlägg
#1

Hej, sökte lite på forumet och hittade ett script som gör om en bild till en thumbnail. Det jag undrar ang. scriptet är hur man gör för att skala ner till enligt en fast bredd, och sedan låta scriptet räkna ut den passande höjden?

EDIT: Kanske inte behöver hjälp ändå =)

The_HulkMedlem sedan juni 20031 837 inlägg
#2

Skulle du behöva hjälp så är det bra om du även postar lite kod.

streetrobbanMedlem sedan jan. 20011 140 inlägg
#3

The_Hulk: Jo jag vet, och jag får ett felmeddelande som säger "Warning: Cannot modify header information - headers already sent by". Och så är det rad 59 som ser ut som nedan. Hur kommer man runt header-problemet?

case 2:
header("Content-type: image/jpeg");
$imgres = ImageCreateFromJpeg($picture);
break;

Och här är hela koden:

<?
$maxwidth = 119;
$maxheight = 97;
$imgquality = 100;

$picture = "images/products/7P563261_3.jpg";

if (!isset($picture) || !file_exists($picture)) {
    exit;
}

$img_x_y_size =  getimagesize($picture);

switch($img_x_y_size[2]) {
case 1:
    header("Content-type: image/gif");
    $imgres = ImageCreateFromGif($picture);
    break;
case 2:
    header("Content-type: image/jpeg");
    $imgres = ImageCreateFromJpeg($picture);
    break;
case 3:
    header("Content-type: image/png");
    $imgres = ImageCreateFromPng($picture);
    break;
}

$imgwidth = imagesx($imgres);
$imgheight = imagesy($imgres);

$procentwidth = $maxwidth / $imgwidth;
$procentheight = $maxheight / $imgheight;

if ($procentwidth > $procentheight) {
    $newwidth = round($imgwidth * $procentwidth);
    $newheight = round($imgheight * $procentwidth);
} else {
    $newwidth = round($imgwidth * $procentheight);
    $newheight = round($imgheight * $procentheight);
}

if ($maxwidth < $img_x_y_size[0]) {
    $thumbres = ImageCreateTrueColor($newwidth, $newheight);
} else {
    $thumbres = ImageCreateTrueColor($img_x_y_size[0], $img_x_y_size[1]);
}

if ($maxwidth < $img_x_y_size[0]) {
    ImageCopyResampled($thumbres, $imgres, 0, 0, 0, 0, $newwidth, $newheight, $imgwidth, $imgheight);
} else {
    ImageCopyResampled($thumbres, $imgres, 0, 0, 0, 0, $img_x_y_size[0], $img_x_y_size[1], $img_x_y_size[0], $img_x_y_size[1]);
}

ImageDestroy($imgres);

switch($img_x_y_size[2]) {
case 1:
    ImageGif($thumbres, "", $imgquality);
    break;
case 2:
    ImageJpeg($thumbres, "", $imgquality);
    break;
case 3:
    ImagePng($thumbres, "", $imgquality);
    break;
}

ImageDestroy($thumbres);
?>
streetrobbanMedlem sedan jan. 20011 140 inlägg
#4

Jag lade till följande kod i toppen och botten av dokumentet, då försvann föregående varning.

ob_start();
ob_end_flush();

Men istället skriver den bara ut följande på sidan.

Bilden “[url]http://www.doman.se/sale.php”[/url] kan inte visas, då den innehåller fel.
The_HulkMedlem sedan juni 20031 837 inlägg
#5

Du har förmodligen någon utskritp tidigare i koden.
Kanske ett blanktecken/radmatning i början av någon PHP-fil.
Den brukar säga till var utmatningen sker.
Problemet sker då man försöker ändra headern efter man börjat skriva ut vanlig HTML-kod. Det problemet blev du dock av med när du använde ob_start() och ob_end_flush().
Ta bort dem igen och kolla exakt var felet startar.

The_HulkMedlem sedan juni 20031 837 inlägg
#6

Gjorde ett litet snabbt test

Warning: Cannot modify header information - headers already sent by (output started at E:\www\rolegame\www\phpErr.php:2) in E:\www\rolegame\www\phpErr.php on line 3
1: <?
2:     echo "test";
3:     header("content-type: html/text");
4: ?>

Annat test

Warning: Cannot modify header information - headers already sent by (output started at E:\www\rolegame\www\phpErr.php:2) in E:\www\rolegame\www\phpErr.php on line 4
1:
2:<?
3:    //echo "test";
4:    header("content-type: html/text");
5:?>

Så kolla vad det står i "(output started at E:\www\rolegame\www\phpErr.php:2)"
Det är förmodligen där ditt fel ligger.

streetrobbanMedlem sedan jan. 20011 140 inlägg
#7

Jag förstår inte riktigt vad du menar... ska jag lägga till den här koden överst i dokumentet?

2:<?
3:    //echo "test";
4:    header("content-type: html/text");
5:?>

Thumbnails koden ligger ju mitt i en HTML sida, där jag använder includes både toppen och botten.

streetrobbanMedlem sedan jan. 20011 140 inlägg
#8

Ok, jag gjorde en fil med din kod i, följande händer:

Ex 1:
Felmeddelande:

test
Warning: Cannot modify header information - headers already sent by (output started at /home/doman.se/www/phpErr.php:2) in /home/doman.se/www/phpErr.php on line 3

Kod:

<?
echo "test";
header("content-type: html/text");
?>

Ex 2:
Om jag skriver in adressen till sidan i browsern, så frågar den om jag vill spara sidan.

Kod:

<?
header("content-type: html/text");
?>
The_HulkMedlem sedan juni 20031 837 inlägg
#9

Var kanske inte så tydlig.
siffrorna i början på raderna i php-koden skulle bara representera radnummer. inget som ska vara med i koden.
Men om du kör din kod som den var INNAN du la till ob_start och ob_end_flush och tittar på det felmeddelande du fick så kan du se i vilken fil du skriver ut de första som strular till det för dig. Klstsra in felmeddelande här om du är osäker.

streetrobbanMedlem sedan jan. 20011 140 inlägg
#10

Då måste jag hänvisa till meddelande #3 i den här tråden, det är koden som den var från början.

The_HulkMedlem sedan juni 20031 837 inlägg
#11

Du visar inte vilken som är rad 59.
är du 100% säker på att du kodbitarna du kopierat in kommer från rätt filer?
från felmeddelande får du reda på två filer och två rader.
Vilka rader är det, vias både lite före och efter. Lättast om du visade hela filen men förstår om du inte vill visa all kod. det är dock lättare att hjälpa till om man får se hela koden.

streetrobbanMedlem sedan jan. 20011 140 inlägg
#12

Det här är hela koden:

<?php
require 'includes/top.php';
require 'includes/menu_for-sale.php';
?>

	<td bgcolor="#CACABD" valign="top" background="images/bg.gif">
	<img src="images/top.gif" style="vertical-align: bottom">
	
	<table border="0" width="645px" height="100%" cellspacing="0" cellpadding="0">
	<tr>
		<td width="10px" height="20px">
		</td>
		<td width="480px" height="20px">
		</td>
		<td width="10px" height="20px">
		</td>
		<td width="5px" height="20px" bgcolor="#FFFFFF">
		</td>
		<td width="10px" height="20px">
		</td>
		<td width="120px" height="20px">
		</td>
		<td width="10px" height="20px">
		</td>
	</tr>
	<tr>
		<td width="10px" height="100%">
		&nbsp;
		</td>
		<td width="480px" valign="top" height="100%">
		<img src="images/sub.for_sale.gif"><br/>
		<br/>
		
		Please choose a category to the left.<br/>
		<br/>
		
		<img src="images/sub.random_antiques.gif"><br/>
		<br/>

		<?php		
		$maxheight = 119;
		$maxwidth = 97;
		$imgquality = 100;
		
		$picture = "562009_3.jpg";
		
		if (!isset($picture) || !file_exists($picture))
		{
			exit;
		}
		
		$img_x_y_size =  getimagesize($picture);
		
		switch($img_x_y_size[2])
		{
			case 1:
			header("Content-type: image/gif");
			$imgres = ImageCreateFromGif($picture);
			break;
			case 2:
			header("Content-type: image/jpeg");
			$imgres = ImageCreateFromJpeg($picture);
			break;
			case 3:
			header("Content-type: image/png");
			$imgres = ImageCreateFromPng($picture);
			break;
		}
		
		$imgwidth = imagesx($imgres);
		$imgheight = imagesy($imgres);
		
		$procentwidth = $maxwidth / $imgwidth;
		$procentheight = $maxheight / $imgheight;
		
		if ($procentwidth > $procentheight)
		{
			$newwidth = round($imgwidth * $procentwidth);
			$newheight = round($imgheight * $procentwidth);
		}
		else
		{
			$newwidth = round($imgwidth * $procentheight);
			$newheight = round($imgheight * $procentheight);
		}
		
		if ($maxwidth < $img_x_y_size[0])
		{
			$thumbres = ImageCreateTrueColor($newwidth, $newheight);
		}
		else
		{
			$thumbres = ImageCreateTrueColor($img_x_y_size[0], $img_x_y_size[1]);
		}
		
		if ($maxwidth < $img_x_y_size[0])
		{
			ImageCopyResampled($thumbres, $imgres, 0, 0, 0, 0, $newwidth, $newheight, $imgwidth, $imgheight);
		}
		else
		{
			ImageCopyResampled($thumbres, $imgres, 0, 0, 0, 0, $img_x_y_size[0], $img_x_y_size[1], $img_x_y_size[0], $img_x_y_size[1]);
		}
		
		ImageDestroy($imgres);
		
		switch($img_x_y_size[2])
		{
			case 1:
			ImageGif($thumbres, "", $imgquality);
			break;
			case 2:
			ImageJpeg($thumbres, "", $imgquality);
			break;
			case 3:
			ImagePng($thumbres, "", $imgquality);
			break;
		}
		
		ImageDestroy($thumbres);
		?>
		
		<br/>
		
		</td>
		<td width="10px" height="100%">
		&nbsp;
		</td>
		<td width="5px" bgcolor="#FFFFFF" height="100%">
		&nbsp;
		</td>
		<td width="10px" height="100%">
		&nbsp;
		</td>
		<td width="120px" valign="top" height="100%">
		
		<?php
		require 'includes/random_antiques.php';
		?>
		
		</td>
		<td width="10px" height="100%">
		&nbsp;
		</td>
	</tr>
	</table>
	
	</td>
</tr>
<?php
require 'includes/bottom.php';
?>

Och här är felmeddelandet:

Warning: Cannot modify header information - headers already sent by (output started at /home/www/includes/top.php:5) in /home/www/for_sale.php on line 63

Och här är rad 63:

header("Content-type: image/jpeg");
The_HulkMedlem sedan juni 20031 837 inlägg
#13

Vilken fil är top.php?

TroxyMedlem sedan mars 20041 505 inlägg
#14

Men snälla nån, ni snurrar ju till allting ;)
Felmeddelandet talar ju om exakt vad som är fel! Bara att läsa:

Warning: Cannot modify header information - headers already sent by (output started at /home/www/includes/top.php:5) in /home/www/for_sale.php on line 63

Man kan inte modifiera HTTP-headers med funktionen header() efter att man börjat skriva ut någonting till browsern.
I felmeddelandet så står det att utskriften börjar i filen top.php på rad 5.
I filen for_sale.php så försöker du använda header() på rad 63 även fast utskriften redan är påbörjad.

Om din kod ser ut som den gör i ditt senaste inlägg så förstår jag att det blir tokfel. Du blandar ju HTML-kod och bildfunktioner hej vilt.
Om du vill generera en thumbnail i PHP så lägger du all PHP-kod för detta i en egen fil, som du exempelvis döper till thumb.php. Sedan infogar du bilden med exempelvis:

<img src="thumb.php" alt="">
The_HulkMedlem sedan juni 20031 837 inlägg
#15

Det är det jag har försökt komma fram till men fick inget tydlig svar på vilka filer som var inblandade och vilka koder som tillhörde vilka filer så därför brydde jag mig inte om att kontrolle php-koden. men nu när jag tittade lite närmare så ser man snabbt att switch-satsen kommer att misslyckas då han redan har skrivit ut vanlig html-kod tidigare i php-skriptet.
Om du kollar i post #6 så ser du att jag försökte visa hur man skulle tyda felmeddelandet.

streetrobbanMedlem sedan jan. 20011 140 inlägg
#16

Aha, nu verkar det fungera bra =) Men bilderna varierar i höjd beroende på hur stor orginalbilden är. Jag antar att jag får anpassa utseendet efter bilderna på något sätt.

Hur fasen ska jag göra för att hämta flera bilder från en databas då?

Jag använder mig av följande kod, och det verkar funka bra.

i for_sale.php

<img src=\"images/products/thumb.php?picture2=$picture2\" alt=\"$picture2\" border=0>

i thumb.php

$picture = $_GET['picture2'];
The_HulkMedlem sedan juni 20031 837 inlägg
#17

Vill du göra om flera bilder samtidigt får du göra ett skript som sparar alla thumbnail på en gång och sen är det ju bara att visa dem som vanliga bilder.

Annars är det som du verkar göra nu.

yeltzinMedlem sedan sep. 20068 inlägg
#18

Jag har gjort ett script som gör thumbnails av bilder.. skapandet ligger som en funktion, och det är bara att anropa funktionen en gång per bild man vill göra om.. så .. en funktion är nog lösningen.. :)

143 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
140 ms — hämta tråd, inlägg och bilagor (db)