PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : GDI, imagerotate und Bildgröße



BlueJay
17-02-2010, 14:17
Hallo Leute,

bei imagerotate scheint die Bildgröße an das gedrehte Bild angepasst zu sein. Frage: wie? Werden transparente Ecken weggeschnitten? Wie wird erweitert?

Code:

// Drehen um 120Grad
$ima2=imagerotate($ima1,$dreh,0); // ima1 um Mitte gedreht!
$anz=imagecopy($ima2,$ima1, $size/2,0, 0,0,$size,2*$size); // dann nochmal draufgepappt


Es wäre gut, die Dimensionen des neuen Bildes $ima2 zu wissen, getimagesize ist hier nicht sehr hilfreich.

so long,
uja

undefined
17-02-2010, 20:00
Das ist Abhängig vom Bildtype.
Die Normale Variante ist diese.


##
$bild = "./test.png";

$imadata=getimagesize($bild);
// var_dump( "<pre>", $imadata, "</pre>" );

$ima0 = imagecreatefrompng($bild);
// Setze Hindergundfarbe
$weiss = imagecolorallocate($ima0, 255, 255, 255);
// Drehe
$fertig = imagerotate($ima0, 45, $weiss, 0);
// Lösche Hindergundfarbe
imagecolordeallocate($fertig,$weiss);
// Entmüllen
imagedestroy($ima0);

if (headers_sent())
exit(0);

header ( "Content-Type: image/png;" );
imagepng($fertig);
imagedestroy($fertig);

BlueJay
18-02-2010, 07:32
Hm, das beantwortet leider nicht die aktuelle Frage.

Also: es existiert ein $ima0 mit $breite0 und $hoehe0. Dieses wird um 30Grad gedreht und ergibt dabei $ima1. Dass sich $ima1 zickig mit dem Hintergrund anstellt, steht erstmal hintenan. (php 4.5)

Obendrein erweitert es sich passend(?) zum Drehwinkel. Leider habe ich manchmal einen schmalen Rand, manchmal einen breiteren. Dann sind im transparenten Bereich feine Haarlinien zu sehen, die Ränder des Ursprungbildes, denselben Mist, den mir Gimp beim Setzen der Transparenz oft liefert, und der beim Drehen dann auffällt, wenn er vorher nicht mit frisch Befüllen und Fill-Toleranz=35% verhindert wird.
Diese Streifen sind aber hier nebensächlich, da das Bild noch weiter bearbeitet werden soll.

$ima0 soll jetzt nochmal so darauf gepappt werden, dass es genau in der Mitte ist.

Bisherige Lösung:
$ima1 wird abgespeichert und die Dimensionen anschließend mit getimagesize ausgelesen.

Von dieser Lösung will ich runter, es sollte nicht auf die Platte zugegriffen werden.

BlueJay
18-02-2010, 15:22
Langsam habe ich den Eindruck, dass mich die GDI (2.0.28-kompatibel) in punkto Bildgröße veräppelt. Ein ursprünglich 96 Pixel breiter Bereich wird mir nach 3 Transformationen auf ca.78px heuntergekürzt, dafür werde ich bei jeder Aktion mit einem netten Rand beglückt, bei der letzten um je 8px.

Ich glaube, ich sollte meinem Provider mal vorschlagen, upzudaten.

undefined
22-02-2010, 15:31
Ehrlich gesagt habe ich nur einmal richtig mit gd gearbeitet. Bin dann ganz schnell auf ImageMagick um gestiegen. Das kann wesentlich mehr, aber mit dem Nachteil das man system() Befehle absetzen muß.

BlueJay
24-02-2010, 23:49
Mit dem Update habe ich zum erstemal gesehen, wie das Bild zum Schluss aussehen sollte, aber nur 1x.
Beim 2.Bild gab es einen php-Speicherüberlauf (imagecopyresample), und um keine rote Karte vom Admin zu bekommen, wurde das Projekt erstmal begraben.

BlueJay
01-03-2010, 06:11
so, das Projekt ging doch noch weiter.

Was ich gesucht hatte, waren


$breite=ImageSX($ima0);
$hoehe=ImageSX($ima0);


Dass rotate einige Eigenmächtigkeiten beim Resize durchführt, war bekannt.
So wurde ein eigenes "rotate" geschrieben, was nach einigen Pixelfehlerkorrekturen akzeptable Bilder liefert.