Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
Image vergrößern aber nicht skalieren [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
Image vergrößern aber nicht skalieren


 
Udii
19-08-2010, 17:53 
 
Hallo,

ich suche eine Möglichkeit, ein vorhandenes Bild zu vergrößern, dabei aber das Bild nicht neu zu skalieren.

Beispiel:
Ich habe ein Bild mit der Größe 80x30 Pixel und möchte es gerne auf 80x50 Pixel vergrößern, also einfach unter das Bild einen weißen Rand mit einer Höhe von 20 Pixeln hinzufügen und das Bild dann neu ausgeben.

Warum: Weil Facebook für die Vorschau von Links erst Bilder anzeigt, die mindestens 50x50 Pixel groß sind und meine Grafiken sind alle 80x30 Pixel groß und es sind knapp 400 Grafiken, die ich alle ändern müsste...

Hoffe mir kann jemand helfen und ich hoffe auch ich habe mich verständlich ausgedrückt ;)

Achja, ich bin neu hier: Hallo liebe Community ;)

:danke:

 
Kropff
19-08-2010, 17:59 
 
Entweder mit der Gdlib oder ImageMagick. Wenn du Photoshop hast, kannst du das in einem Rutsch mit einer Aktion erledigen.

Peter

 
AmicaNoctis
19-08-2010, 20:35 
 
Hallo,

der kostenlose IrfanView kann auch einfache Operationen im Batch-Modus ausführen.

Gruß,

Amica

 
Udii
20-08-2010, 11:06 
 
Hey Kropff, hey AmicaNoctis,

dass es solche Möglichkeiten gibt, ist mir klar! Aber dann muss ich auf meiner Webseite auch ne Menge am Design ändern und die CSS umschreiben und mehr platz schaffen und und und...

Die Grafiken sollen auch für eine externe Seite (Facebook) vergrößert werden und auf meiner Webseite so bleiben, ich füge dann einfach nur eine versteckte Grafik auf jede Seite ein die dann für Facebook gedacht ist.

Aus diesem Grund wäre es klasse, wenn mir hier jemand behilflich sein kann, das ganze via PHP umzusetzen...

Udii

 
Kropff
20-08-2010, 11:36 
 
Aus diesem Grund wäre es klasse, wenn mir hier jemand behilflich sein kann, das ganze via PHP umzusetzen...
Dann arbeite mit der gdlib (http://macx.de/essays/gdlib/).

Peter

 
Udii
20-08-2010, 11:54 
 
Hey Peter,

gdlib ist mir bei der Suche schon aufgefallen und ich habe dort mit meinen schlechten PHP Kenntnissen versucht was zu basteln (gdlib – Bildformate macximal (http://macx.de/essays/gdlib/bildformate.html)) aber leider ohne Erfolg!

Die Grafik wird immer gestreckt und ich brauche einfach die Original Grafik 80x30 Pixel als 80x50 Pixel mit einem 20 Pixel hohem Rand auf der Unterseite.

Hier mal ein Bild um es zu verdeutlichen, oben so wie ich es bisher hinbekommen habe und unten wie ich es gerne haben möchte...

http://img3.imagebanana.com/img/gu735hpy/example.png

Udi

 
AmicaNoctis
20-08-2010, 11:58 
 
Hallo,

Hintergrundbild erstellen (http://de.php.net/manual/de/function.imagecreatetruecolor.php).
Hintergrund mit weißer (http://de.php.net/manual/de/function.imagecolorallocate.php) Farbe füllen (http://de.php.net/manual/de/function.imagefill.php).
Bild auf den Hintergrund kopieren (http://de.php.net/manual/de/function.imagecopy.php).

Gruß,

Amica

 
Udii
20-08-2010, 12:03 
 
Hey Amica,

danke dir!

Kannst du mir vielleicht dabei helfen das umzusetzen? Ich habe Programmiertechnisch keine Ahnung... Mir liegt das grafische mehr ;)

Gerne werde ich dafür auch einen Amazon Wunschzettel um eine Buch oder so erleichtern wenn ich das darf!

Udi

 
AmicaNoctis
20-08-2010, 12:08 
 
Ich hab grad keine Zeit dafür, aber ich verschieb das mal nach Projekthilfe. Vielleicht findet sich ja jemand dafür.

 
fireweasel
22-08-2010, 22:33 
 
Nicht erschrecken, die Benutzung ist ziemlich einfach. Siehe Anwendungsbeispiel am Ende.

Für alle Menschen, die außerhalb des Sauerkrautimperiums leben, habe ich den
Quelltext mit Kommentaren versehen, die in einer Sprache verfasst sind, von der
ich glaube, dass sie dem Englischen nahe kommt. ;)

/*
what?:
image_canvas_resize 0.0 (2010-08-22)

found at:
http://php-resource.de/forum/projekthilfe/100115-image-vergroessern-aber-nicht-skalieren.html


note:
The image creating functions can cause the script to break
if the given dimensions don't fit into PHP's memory limit.
That's an issue of the internal PHP memory allocation functions
and therefore __can't__ be fixed within a PHP script.
*/

/// copy a bitmap into a bigger bitmap
/// return rsrc(image) | FALSE in case of an error
function image_canvas_resize(
$src_img, /// rsrc(image) image resource | str(uri:path) path to an image file
$top = 0, /// int(0...) upper padding in pixels
$left = 0, /// int(0...) left padding in pixels
$bottom = 0, /// int(0...) lower padding in pixels
$right = 0, /// int(0...) right padding in pixels
$bg_colour = 0x0 /// int(0...0xffffff) |
// str('0x...') background colour as RGB-value
// defaults to black
) {
if (!is_resource($src_img)) {
if (!is_string($src_img) || !is_file($src_img)) {
error::writefln('not a path given %s', $src_img);
// neither a path nor an image resource given
return FALSE;
}
// detect image file type
if (!preg_match(
// the "." is only there to make the recognised pattern 7 bytes long
'/\A(?:\xff\xd8\xff|GIF8[79]a|\x89PNG\x0d\x0a.)/s',
file_get_contents($src_img, 0, NULL, 0, 7),
$hits
)) {
// unknown image format
return FALSE;
}
static $loaders = array (
3 => 'imagecreatefromjpeg',
6 => 'imagecreatefromgif',
7 => 'imagecreatefrompng',
);
if (!isset($loaders[strlen($hits[0])])) {
return FALSE; // could not detect image file type
}

$loaderfunc = $loaders[strlen($hits[0])];
// load image to resource
if (!is_resource($src_img = $loaderfunc($src_img))) {
return FALSE; // could not load image from file
}
}

// 24 bit RGB or 8 bit palette?
$true_colour = imageistruecolor($src_img);

// sanitize dimensions
$top = $top < 0 ? 0 : (int) $top;
$left = $left < 0 ? 0 : (int) $left;
$bottom = $bottom < 0 ? 0 : (int) $bottom;
$right = $right < 0 ? 0 : (int) $right;

// calculate dimensions for the destination bitmap
$dst_width = imagesx($src_img) + $left + $right;
$dst_height = imagesy($src_img) + $top + $bottom;

// build the destination bitmap
if (!is_resource(
$dst_img = $true_colour
? imagecreatetruecolor($dst_width, $dst_height)
: imagecreate($dst_width, $dst_height)
)) {
return FALSE;
}

// sanitize background colour argument
$bg_colour = is_numeric($bg_colour)
? intval($bg_colour, preg_match('/\A\s0x/', $bg_colour) ? 10 : 16) & 0xffffff
: 0x0;

if (!$true_colour) {
imagepalettecopy($dst_img, $src_img);
}

// allocate background colour
$r = ($bg_colour >> 16) & 0xff;
$g = ($bg_colour >> 8) & 0xff;
$b = $bg_colour & 0xff;
if (
!is_int($bg_colour = imagecolorallocate($dst_img, $r, $g, $b)) ||
$bg_colour === -1 // PHP < 5.1.3
) {
// there is no free entry in the palette
// so we choose one which fits best
$bg_colour = imagecolorclosest($dst_img, $r, $g, $b);
}
// note: $bg_colour is now an RGB value for truecolour images
// or a palette index number otherwise

// fill with background colour
if (!imagefilledrectangle(
$dst_img,
0, 0, $dst_width - 1, $dst_height - 1,
$bg_colour
)) {
return FALSE;
}

// copy the source bitmap into the destination bitmap
if (!imagecopy(
$dst_img, $src_img,
$left, $top, // dst_x, dst_y
0, 0, // src_x, src_y
imagesx($src_img), imagesy($src_img) // src_w, src_h
)) {
return FALSE;
}

return $dst_img;
}



$src_path = 'path/to/src-jpeg.jpg';

$dst_path = 'another/path/to/dst.png';

$src = $src_path;

// 20 Pixel breiten Rand unten ("at the bottom")
// in weiß (RGB: 0xffffff) hinzufuegen

$dst = image_canvas_resize($src, 0, 0, 20, 0, 0xffffff);

// das Ergebnis abspeichern
if (!imagepng($dst, $dst_path)) {
die(sprintf(
'could not write image resource to file "%s"',
$dst_path
));
}

 
Udii
23-08-2010, 17:03 
 
Bin jetzt weiter gekommen...

Folgende Umgebung:
auf dem Server liegen in einem Ordner folgende Dateien:
src.gif (80x50 Pixel großes weiße Grafik)
welle.gif und hundi.gif (80x30 Pixel große Grafik)
img.php (das folgende Script)


<?php
// Create image instances
$dest = imagecreatefromgif('src.gif');
$src = imagecreatefromgif($img);

// Copy and merge
imagecopymerge($dest, $src, 0, 0, 0, 0, 80, 50, 100);

// Output and free from memory
header('Content-Type: image/gif');
header('Pragma: no-cache');
imagegif($dest);

imagedestroy($dest);
imagedestroy($src);
?>


Wenn ich jetzt die img.php wie folgt im Browser aufrufe, wird ein Bild erzeugt aber der Hintergrund ist mal weiß und mal schwarz:

Hier schaut selber:
http://www.sport-fuhr.de/php/img.php?img=welle.gif
http://www.sport-fuhr.de/php/img.php?img=hundi.gif

Wie kann ich das ändern?

 
fireweasel
29-08-2010, 01:06 
 
Bin jetzt weiter gekommen...

Folgende Umgebung:
auf dem Server liegen in einem Ordner folgende Dateien:
src.gif (80x50 Pixel großes weiße Grafik)
welle.gif und hundi.gif (80x30 Pixel große Grafik)
img.php (das folgende Script)


<?php
// Create image instances
$dest = imagecreatefromgif('src.gif');
$src = imagecreatefromgif($img);

// Copy and merge
imagecopymerge($dest, $src, 0, 0, 0, 0, 80, 50, 100);

// Output and free from memory
header('Content-Type: image/gif');
header('Pragma: no-cache');
imagegif($dest);

imagedestroy($dest);
imagedestroy($src);
?>


Wenn ich jetzt die img.php wie folgt im Browser aufrufe, wird ein Bild erzeugt aber der Hintergrund ist mal weiß und mal schwarz:

Hier schaut selber:
http://www.sport-fuhr.de/php/img.php?img=welle.gif
http://www.sport-fuhr.de/php/img.php?img=hundi.gif


Ich sehe bei beiden Grafiken einen weißen Hintergrund ...

Wie kann ich das ändern?

Das von mir vorgestellte Script kann unterschiedliche Farben für den zusätzlichen Rand auswählen, wenn schon alle Paletteneinträge belegt sind. Bei deinen Beispiel-Bildern dürfte das aber nicht der Fall sein, weil beide die Farbe Weiß enthalten.

Bei deinem Script vermute ich mal, dass du die Palette der Ziel-Bitmap an die der Ausgangs-Bitmap anpassen musst. Die beiden sind nicht automatisch gleich.

Falls dein Script überhaupt so funktioniert, wie du dir das vorgestellt hast. Die Variable $img taucht aus dem Nichts auf und die imagedestroy()-Anweisungen am Ende halte ich für wenig sinnvoll. Wenn man einfach drauflos experimentiert, kommt man selten zu einer brauchbaren Lösung.

Es ist auch keine gute Idee die Grafiken direkt an den Browser zu senden, wenn man noch am Experimentieren (Herumtesten, Debuggen ...) ist. Da schaffst du dir nur eine zusätzliche Fehlerquelle. Einfacher ist es, die Grafik in eine Datei zu speichern, und die dann bspw. mit einem Image-Viewer unter die Lupe zu nehmen.


Alle Zeitangaben in WEZ +2. Es ist jetzt 04:51 Uhr.