Seite 1 von 2

Bild spiegeln

Verfasst: 1. Dez 2010, 21:35
von Conny Kramer
Ich brauche eine Funktion mit der ich Bilder vertikal spiegeln kann. Die Funktion muss in php geschrieben sein und funktionieren. Das Bildformat ist PNG.
Wär schön wenn jemand so eine Funktion hier posten würde.

Danke

Re: Bild spiegeln

Verfasst: 1. Dez 2010, 21:38
von Blue.Shark
Einfach mal googlen?
SpoilerShow
<?php
/**
* imagereflection
*
* Versieht ein Bild mit einem Spiegeleffekt.
*
* @author Jan Papenbrock, www.solvium.de
* @version 0.1 (Apr-13 2007)
*
* @param $source Quellbild
* @param $background Array, das die RGB-Werte der Hintergrundfarbe enthält,
* wobei R = [0], G = [1], B = [2]
* @param $gradient Enthält die Größe des Verlaufs, anteilig zur Bildgröße
* @param $shadow Enthält die Größe des Schattens, anteilig zur Bildgröße
*
* @return das fertige Bild
*/

function imagereflection ( $simg, $background = array (255, 255, 255), $gradient = 0.55, $shadow = 0.1 ) {
$simgx = imagesx($simg);
$simgy = imagesy($simg);
// Höhen von Verlauf und Schatten in px bestimmen
$gradientH = round($simgy * $gradient);
$shadowH = round($simgy * $shadow);
// Zielbild erzeugen
$dimg = imagecreatetruecolor($simgx, $simgy + $gradientH );
// und mit Hintergrundfarbe füllen
imagefill($dimg, 0, 0, imagecolorallocate($dimg, $background[0], $background[1], $background[2]));
// Quellbild kopieren
imagecopy($dimg, $simg, 0, 0, 0, 0, $simgx, $simgy);
// und das gespiegelte Bild einfügen
$simg = imageflip($simg, 1);
imagecopy($dimg, $simg, 0, $simgy, 0, 0, $simgx, $simgy);

// Verlauf erzeugen
$alphaF = 60 / ($gradientH - 1);
for ($i = 0; $i < $gradientH; $i++) {
$col = imagecolorallocatealpha($dimg, $background[0], $background[1], $background[2], 60 - $i * $alphaF);
imageline($dimg, 0, $simgy + $i, $simgx, $simgy + $i, $col);
}

// Schatten erzeugen
$alphaF = 60 / ($shadowH - 1);
for ($i = 0; $i < $shadowH; $i++) {
$col = imagecolorallocatealpha($dimg, 160, 160, 160, $i*$alphaF + 67);
imageline($dimg, 0, $simgy + $i, $simgx, $simgy + $i, $col);
}

// Bild zurückgeben
return $dimg;
}
?>
Keine Ahnung ob das richtig ist, ich kenn mich mit php nicht aus :D

Re: Bild spiegeln

Verfasst: 1. Dez 2010, 21:39
von Latzhosenträger
Der folgende Code Snippet durchläuft zwei FOR-Schleifen, die erste ist für die X-Achse und die zweite für die Y-Achse. Innerhalb der Schleifen werden die Pixel der letzten Pixelspalte von $rOrgImage in die erste Pixelspalte des $rReturnImage kopiert, dann die vorletzte Pixelspalte von $rOrgImage in die zweite Pixelspalte von $rReturnImage usw. Nach Beendigung der Schleifendurchläufe befindet sich in $rReturnImage das horizontal gespiegelte Abbild von $rOrgImage. Aufgerufen wird das Script zum Beispiel im IMG-Tag mit dem einzigen Query-Parameter "d", der das betreffende Bild angibt.

Code: Alles auswählen

<?PHP
  $strOrgImage = './path/to/image/' . $_GET['d'];

  list ( $iOrgImageX, $iOrgImageY,
         $iOrgImageType ) = getimagesize ( $strOrgImage );

  $iOrgImageX -= 1;

  switch ( $iOrgImageType )
  {
    case 1:
      $rOrgImage = imagecreatefromgif ( $strOrgImage );
      break;
    case 2:
      $rOrgImage = imagecreatefromjpeg ( $strOrgImage );
      break;
    case 3:
      $rOrgImage = imagecreatefrompng ( $strOrgImage );
  }

  $rReturnImage = imagecreatetruecolor ( $iOrgImageX + 1, $iOrgImageY );

  for ( $iX = 0; $iOrgImageX >= 0; $iOrgImageX-- )
  {
    for ( $iY = 0; $iY <= $iOrgImageY; $iY++ )
    {
      $iColorIndex = imagecolorat ( $rOrgImage, $iOrgImageX, $iY );
      imagesetpixel ( $rReturnImage, $iX, $iY, $iColorIndex );
    }

    $iX++;
  }

  switch ( $iOrgImageType )
  {
    case 1:
      header ( 'content-type: image/gif' );
      imagegif ( $rReturnImage );
      break;
    case 2:
      header ( 'content-type: image/jpeg' );
      imagejpeg ( $rReturnImage );
      break;
    case 3:
      header ( 'content-type: image/png' );
      imagepng ( $rReturnImage );
  }

  imagedestroy ( $rOrgImage );
  imagedestroy ( $rReturnImage );
?> 
Anwengungsbeispiel:

Code: Alles auswählen

<html>
  <head>
    <title>
      BEISPIEL: Bild horizontal gespiegelt
    </title>
  </head>
  <body>
    Bild horizontal gespiegelt:<br />
    <br />
    <img src="reflectImage.php?d=picture.jpg" />
  </body>
</html>
Quelle

Re: Bild spiegeln

Verfasst: 1. Dez 2010, 21:40
von Latzhosenträger
Blue.Shark hat geschrieben:* Versieht ein Bild mit einem Spiegeleffekt.
Kann ja nur falsch sein. Er will ja keinen Spiegeleffekt.

Re: Bild spiegeln

Verfasst: 1. Dez 2010, 21:43
von Blue.Shark
Ok dann ignoriert meine Nachricht^^

Re: Bild spiegeln

Verfasst: 1. Dez 2010, 21:45
von Conny Kramer
Latzhosenträger das geht bei mir iwie nich^^

Re: Bild spiegeln

Verfasst: 1. Dez 2010, 21:47
von Latzhosenträger
Conny Kramer hat geschrieben:Latzhosenträger das geht bei mir iwie nich^^
Dann google selbst..

Re: Bild spiegeln

Verfasst: 1. Dez 2010, 21:49
von Conny Kramer
hab ich, hab aber nix gefunden was funktioniert, deswegen frag ich ja du 5 watt birne

ich möchte das also so haben:

Code: Alles auswählen

function spiegel($img){
....code....
return $img;
}

Re: Bild spiegeln

Verfasst: 2. Dez 2010, 11:16
von Benu
SpoilerShow

Code: Alles auswählen

define("FLIP_X", 1);    // spiegeln an X-Achse
define("FLIP_Y", 2);    // spiegeln an Y-Achse
define("FLIP_BOTH", 4); // Punktspiegelung im Mittelpunkt

/**
 * image_flip
 *
 * spiegelt ein Bild in eienr bestimmten Richtung
 *
 * @ToDo:
 * - kopieren der Pixel funktioniert nicht korrekt bei weißen (eventuell auch schwarzen) Pixeln
 *
 * @param $source Ressource Zeiger auf das Bild, was gespiegelt werden soll
 * @param $flip   int       Richtung in die gespiegelt wird (FLIP_X, FLIP_Y, FLIP_BOTH)
 * @return Ressource
 */
function image_flip($source, $flip) {
	$x_max = imagesx($source);
	$y_max = imagesy($source);
	$im = imagecreatetruecolor($x_max, $y_max);
	
	for ($y_i = 0; $y_i <= $y_max; ++$y_i) {
		for ($x_i = 0; $x_i <= $x_max; ++$x_i) {
			$color = imagecolorat($source, $x_i, $y_i);
			$coords = flip_coords($x_i, $y_i, $x_max, $y_max, $flip);

			imagesetpixel($im, $coords[0], $coords[1], $color);
		}
	}
	
	return $im;
}

/**
 * flip_coords
 *
 * spiegelt Koordinaten in bestimmte Richtung
 * 
 * @param $x     int reele x-Koordinate
 * @param $y     int reele y-Koordinate
 * @param $x_max int Breite des Koordinatensystems
 * @param $y_max int Breite des Koordinatensystems
 * @return array
 */
function flip_coords($x, $y, $x_max, $y_max, $direction) {
	$coords = array($x, $y);
	
	if ($direction == FLIP_X || $direction == FLIP_BOTH) {
		$coords[0] = $x_max-$x;
	}
	if ($direction == FLIP_Y || $direction == FLIP_BOTH) {
		$coords[1] = $y_max-$y;
	}
	return $coords;
}
Habs kurz mit 2 Bildern getestet und funktionierte da auch.

Re: Bild spiegeln

Verfasst: 2. Dez 2010, 15:34
von Schmiddi
Conny Kramer hat geschrieben:hab ich, hab aber nix gefunden was funktioniert, deswegen frag ich ja du 5 watt birne

ich möchte das also so haben:
Erst frech werden, dann noch fordern

Re: Bild spiegeln

Verfasst: 2. Dez 2010, 17:08
von Conny Kramer
selbst schuld bei so einer dämlichen antwort

Re: Bild spiegeln

Verfasst: 2. Dez 2010, 17:20
von Conny Kramer
Benu hat geschrieben:
SpoilerShow

Code: Alles auswählen

define("FLIP_X", 1);    // spiegeln an X-Achse
define("FLIP_Y", 2);    // spiegeln an Y-Achse
define("FLIP_BOTH", 4); // Punktspiegelung im Mittelpunkt

/**
 * image_flip
 *
 * spiegelt ein Bild in eienr bestimmten Richtung
 *
 * @ToDo:
 * - kopieren der Pixel funktioniert nicht korrekt bei weißen (eventuell auch schwarzen) Pixeln
 *
 * @param $source Ressource Zeiger auf das Bild, was gespiegelt werden soll
 * @param $flip   int       Richtung in die gespiegelt wird (FLIP_X, FLIP_Y, FLIP_BOTH)
 * @return Ressource
 */
function image_flip($source, $flip) {
	$x_max = imagesx($source);
	$y_max = imagesy($source);
	$im = imagecreatetruecolor($x_max, $y_max);
	
	for ($y_i = 0; $y_i <= $y_max; ++$y_i) {
		for ($x_i = 0; $x_i <= $x_max; ++$x_i) {
			$color = imagecolorat($source, $x_i, $y_i);
			$coords = flip_coords($x_i, $y_i, $x_max, $y_max, $flip);

			imagesetpixel($im, $coords[0], $coords[1], $color);
		}
	}
	
	return $im;
}

/**
 * flip_coords
 *
 * spiegelt Koordinaten in bestimmte Richtung
 * 
 * @param $x     int reele x-Koordinate
 * @param $y     int reele y-Koordinate
 * @param $x_max int Breite des Koordinatensystems
 * @param $y_max int Breite des Koordinatensystems
 * @return array
 */
function flip_coords($x, $y, $x_max, $y_max, $direction) {
	$coords = array($x, $y);
	
	if ($direction == FLIP_X || $direction == FLIP_BOTH) {
		$coords[0] = $x_max-$x;
	}
	if ($direction == FLIP_Y || $direction == FLIP_BOTH) {
		$coords[1] = $y_max-$y;
	}
	return $coords;
}
Habs kurz mit 2 Bildern getestet und funktionierte da auch.

das funktioniert nicht richtig bei mir. hab es mit meinem schwarz -weiß bild probiert und da erscheinen immer noch zusätzlich schwarze pixel auf dem gespiegelten bild.

Re: Bild spiegeln

Verfasst: 2. Dez 2010, 17:29
von Latzhosenträger
Meinst du ernsthaft, dass dir noch jemand weiterhilft..?

Re: Bild spiegeln

Verfasst: 2. Dez 2010, 17:34
von Conny Kramer
du kannst mir ja anscheined eh nicht helfen also brauchste hier och nicht mehr reinschreiben. und ja ich hoffe dass mir noch jmd weiterhilft.

Re: Bild spiegeln

Verfasst: 2. Dez 2010, 17:36
von Latzhosenträger
Ich mache mir die Mühe dir etwas raus zusuchen und du bedankst dich nicht einmal. Was erwartest du eigentlich? Das dir jemand dein Script schreibt? Geh auf php.net und baus dir selbst, wenn dir google nicht hilft.