• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Bildmanipulation

blabla333

Mitglied
Kennt jemand vielleicht ein Script mit welchem man Teile eines Bildes unkenntlich machen kann?

Es wird eine Bilddatei ausgewählt, anschließend wird per Auswahl (ähnlich wie beim Croppen hier: DeepLiquid » Jcrop Image Cropping Demos) der Bereich ausgewählt, der unkenntlich gemacht werden soll. Ideal wäre wirklich verpixeln, alternativ einfach mit Farbe füllen.
 
Auf der von dir verlinkten Seite findest du Beispiele, wie ein Bereich selektiert wird und die Werte in Formularfelder geschrieben werden. Damit hast du die Koordinaten, mit denen du mit PHP diesen Bereich verpixeln kannst
 
Ein Möglichkeit wäre, mit diesem Bereich ein neues Imgae zu erstellen, dieses zu verkleinern und dann wieder zu vergößern und danach dieses Image wieder in die Quelle zu kopieren
 
Danke für die Idee.

Code:
$faktor = 0.08;
$quelle = imagecreatefromjpeg("/images/foto.jpg");
$klein_breite = ImageSX($quelle)*$faktor;
$klein_hoehe = ImageSY($quelle)*$faktor;


$verkleinert=ImageCreateTrueColor($klein_breite,$klein_hoehe);
$ziel=ImageCreateTrueColor(ImageSX($quelle),ImageSY($quelle));
ImageCopyResized($verkleinert, $quelle, 0, 0, 0, 0, $klein_breite, $klein_hoehe, ImageSX($quelle),ImageSY($quelle));
ImageCopyResized($ziel, $verkleinert, 0, 0, 0, 0, ImageSX($quelle),ImageSY($quelle), $klein_breite, $klein_hoehe);


header('Content-type: image/jpeg');
imagejpeg($ziel, null);

So würde ich das Bild verkleinern und wieder vergrößern. Entsprechend verpixelt ist das Ganze dann auch.
Aber irgendwie stehe ich wieder mal auf dem Schlauch: Wie kann ich das selektiert machen, d.h. nur einen bestimmten Teil des Bildes kopieren und diesen wieder (nach dem verkleinern und vergrößern) auch wieder in das Originalbild einsetzen?

Würde mich über ein grobes Beispiel freuen.
 
Zuletzt bearbeitet:
Och büdde! :( Guck dir doch mal das Beispiel auf der von dir verlinkten Seite an: DeepLiquid » Jcrop Image Cropping Demos
Da hast du doch die Koordinaten in einem Formular. Bereich auswählen und dann das Formular an ein Script schicken. Damit hast du alles, was du brauchst.
 
Den Teil habe ich ja auch verstanden. Ich meine aber nicht, wie ich die Koordinaten ermittel, sondern wie ich anhand der Koordinaten nur einen Ausschnitt aus dem Bild verkleiner + vergrößer und danach wieder an die gleiche Stelle setze.

Leider stimmt bei meiner Version etwas grundsätzlich nicht :-(

Code:
$ausschnitt_x = 10;
$ausschnitt_y = 20;
$ausschnitt_breite = 200;
$ausschnitt_hoehe = 100;
$faktor = 0.08;


$quelle = imagecreatefromjpeg("/images/foto.jpg");
$klein_breite = ImageSX($quelle)*$faktor;
$klein_hoehe = ImageSY($quelle)*$faktor;


$ausschnitt=ImageCreateTrueColor($ausschnitt_breite,$ausschnitt_hoehe);
$verkleinert=ImageCreateTrueColor($klein_breite,$klein_hoehe);
$ausschnitt_verpixelt=ImageCreateTrueColor($ausschnitt_breite,$ausschnitt_hoehe);
$ziel=ImageCreateTrueColor(ImageSX($quelle),ImageSY($quelle));


imagecopy($ausschnitt, $quelle, 0, 0, $ausschnitt_x, $ausschnitt_y, $ausschnitt_breite, $ausschnitt_hoehe); 
ImageCopyResized($verkleinert, $ausschnitt, 0, 0, 0, 0, $klein_breite, $klein_hoehe, ImageSX($quelle),ImageSY($quelle));
ImageCopyResized($ausschnitt_verpixelt, $verkleinert, 0, 0, 0, 0, ImageSX($quelle),ImageSY($quelle), $klein_breite, $klein_hoehe);
ImageCopyMerge($ziel, $ausschnitt_verpixelt, $ausschnitt_x, $ausschnitt_y, 0, 0, ImageSX($ausschnitt_verpixelt),ImageSY($ausschnitt_verpixelt));


header('Content-type: image/jpeg');
imagejpeg($ziel, null);
 
Du solltest mal über jeder Zeile einen Kommentar schreiben, was da passieren soll. Dann fällt dir vielleicht auf, dass mit $ziel etwas nicht stimmen kann.
 
Hmm, verstehe. $ziel ist eigentlich $quelle. Damit geht es dann auch. Verstehe aber noch nicht, wieso der Ausschnitt nicht ganz passend ist (schwarzer Rand). Auch wenn ich das Zeile für Zeile durchgehe... Ich sehe den Wald vor lauter Bäumen nicht.
 
Code:
ImageCopyMerge($quelle, $ausschnitt_verpixelt, $ausschnitt_x, $ausschnitt_y, 0, 0, $ausschnitt_breite, $ausschnitt_hoehe, 100);

Ich kann den Fehler nicht sehen.
Es soll $ausschnitt_verpixelt von 0,0 mit der Breite $ausschnitt_breite und der Höhe $ausschnitt_hoehe kopiert werden (also alles) und in $quelle an der Koordinate $ausschnitt_x, $ausschnitt_y eingesetzt werden.
 
Die 100 hattest du vorhin nicht drin.
Funktioniert bei mir einwandfrei:
PHP:
<?php
   error_reporting(E_ALL);
   ini_set("display_errors", true);
   
   $ausschnitt_x = 10;
   $ausschnitt_y = 20;
   $ausschnitt_breite = 200;
   $ausschnitt_hoehe = 100;
   $faktor = 0.08;

   // Bild einlesen
   $quelle = imagecreatefromjpeg("./images/test.jpg");
   
   // Verkleinerte Fläche ermitteln
   $klein_breite = ImageSX($quelle)*$faktor;
   $klein_hoehe = ImageSY($quelle)*$faktor;

   // Leeres Bild für Ausschnitt
   $ausschnitt = ImageCreateTrueColor($ausschnitt_breite,$ausschnitt_hoehe);
   
   // Leeres Bild für Verkleinerung
   $verkleinert = ImageCreateTrueColor($klein_breite,$klein_hoehe);
   
   // Verpixelter Ausschnitt
   $ausschnitt_verpixelt = ImageCreateTrueColor($ausschnitt_breite,$ausschnitt_hoehe);
   
   // Auschnitt kopieren
   imagecopy($ausschnitt, $quelle, 0, 0, $ausschnitt_x, $ausschnitt_y, $ausschnitt_breite, $ausschnitt_hoehe)
     or die("Error bei imagecopy($ausschnitt, $quelle, 0, 0, $ausschnitt_x, $ausschnitt_y, $ausschnitt_breite, $ausschnitt_hoehe)");
   
   // Ausschnitt verkleinern
   ImageCopyResized($verkleinert, $ausschnitt, 0, 0, 0, 0, $klein_breite, $klein_hoehe, ImageSX($quelle),ImageSY($quelle))
     or die("Error bei ImageCopyResized($verkleinert, $ausschnitt, 0, 0, 0, 0, $klein_breite, $klein_hoehe, ImageSX($quelle),ImageSY($quelle))");
   
   // Ausschnitt vergrößern
   ImageCopyResized($ausschnitt_verpixelt, $verkleinert, 0, 0, 0, 0, ImageSX($quelle),ImageSY($quelle), $klein_breite, $klein_hoehe)
     or die("Error bei ImageCopyResized($ausschnitt_verpixelt, $verkleinert, 0, 0, 0, 0, ImageSX($quelle),ImageSY($quelle), $klein_breite, $klein_hoehe)");
   
   // Ausschnitt in Ziel kopieren??????
   ImageCopyMerge($quelle, $ausschnitt_verpixelt, $ausschnitt_x, $ausschnitt_y, 0, 0, ImageSX($ausschnitt_verpixelt),ImageSY($ausschnitt_verpixelt), 100)
     or die("Error bei ImageCopyMerge($quelle, $ausschnitt_verpixelt, $ausschnitt_x, $ausschnitt_y, 0, 0, ImageSX($ausschnitt_verpixelt),ImageSY($ausschnitt_verpixelt))");;
    
   header('Content-type: image/jpeg');
   imagejpeg($quelle);
?>
 
Hähä, da war noch ein Fehler drin, dass das bei mir funktioniert hat, ist purer Zufall. Die korrigierte Fassung, achte auf die Kommentare in Großnuchstaben:
PHP:
<?php
   error_reporting(E_ALL);
   ini_set("display_errors", true);
   
   $ausschnitt_x = 10;
   $ausschnitt_y = 10;
   $ausschnitt_breite = 200;
   $ausschnitt_hoehe = 100;
   $faktor = 0.02;

   // Bild einlesen
   $quelle = imagecreatefromjpeg("./images/test.jpg");
   
   // Verkleinerte Fläche ermitteln  HIER KÖNNTEN RUNDUNGSFEHLER AUFTRETEN!!!!!!!!!!!!
   $klein_breite = (int)(ImageSX($quelle)*$faktor);
   $klein_hoehe = (int)(ImageSY($quelle)*$faktor);
  
   // Leeres Bild für Ausschnitt
   $ausschnitt = ImageCreateTrueColor($ausschnitt_breite,$ausschnitt_hoehe);
   
   // Leeres Bild für Verkleinerung
   $verkleinert = ImageCreateTrueColor($klein_breite,$klein_hoehe);
   
   // Verpixelter Ausschnitt
   $ausschnitt_verpixelt = ImageCreateTrueColor($ausschnitt_breite,$ausschnitt_hoehe);
   
   // Auschnitt kopieren
   imagecopy($ausschnitt, $quelle, 0, 0, $ausschnitt_x, $ausschnitt_y, $ausschnitt_breite, $ausschnitt_hoehe)
     or die("Error bei imagecopy($ausschnitt, $quelle, 0, 0, $ausschnitt_x, $ausschnitt_y, $ausschnitt_breite, $ausschnitt_hoehe)");
   
   // Ausschnitt verkleinern      HIER WAR EIN FEHLER!!!!!!!!!!!!!!!!
   ImageCopyResized($verkleinert, $ausschnitt, 0, 0, 0, 0, $klein_breite, $klein_hoehe, $ausschnitt_breite,$ausschnitt_hoehe)
     or die("Error bei ImageCopyResized($verkleinert, $ausschnitt, 0, 0, 0, 0, $klein_breite, $klein_hoehe, $ausschnitt_breite,$ausschnitt_hoehe)");
   
   // Ausschnitt vergrößern       HIER WAR NOCH EIN FEHLER!!!!!!!!!!!!!!!!
   ImageCopyResized($ausschnitt_verpixelt, $verkleinert, 0, 0, 0, 0, $ausschnitt_breite,$ausschnitt_hoehe, $klein_breite, $klein_hoehe)
     or die("Error bei ImageCopyResized($ausschnitt_verpixelt, $verkleinert, 0, 0, 0, 0, $ausschnitt_breite,$ausschnitt_hoehe, $klein_breite, $klein_hoehe)");
   
   // Ausschnitt in Ziel kopieren??????
   ImageCopyMerge($quelle, $ausschnitt_verpixelt, $ausschnitt_x, $ausschnitt_y, 0, 0, ImageSX($ausschnitt_verpixelt),ImageSY($ausschnitt_verpixelt), 100)
     or die("Error bei ImageCopyMerge($quelle, $ausschnitt_verpixelt, $ausschnitt_x, $ausschnitt_y, 0, 0, ImageSX($ausschnitt_verpixelt),ImageSY($ausschnitt_verpixelt))");;
    
   header('Content-type: image/jpeg');
   imagejpeg($quelle);
?>
 
Super tausend Dank.

Ich würde das Ganze gerne noch optimieren: Und zwar ist es ja jetzt so, dass die Pixel abhängig sind von der zuvor getätigten Auswahl bzw. dem Ausschnitt. Sobald das Seitenverhältnis ein andere ist, als das des Originalbildes, werden die Pixel eben auch nicht mehr quadratisch, zudem werden sie größer, je größer der Ausschnitt ist.

Wie könnte man das verbessern?

Edit: Die Pixelgröße könnte man ja mit dem Faktor anpassen, d.h. je größer der Ausschnitt ist, desto kleiner muss der Faktor gewählt werden. Also müsste man z.B. den Faktor von der Größe abhängig machen...
Für die Form (also immer quadratische Pixel) habe ich leider keine Idee...
 
Zuletzt bearbeitet:
Vielleicht kann es ja mal irgendjemand gebrauchen:

Hiermit gibt es immer gleichgroße, quadratische Pixel - unabhängig vom ausgewählten Bildbereich. Der zuvor im Code vorgegebene Faktor (0.02) wird nicht mehr verwendet.

Code:
      $pixel = 7;


      if ($ausschnitt_breite > $ausschnitt_hoehe) {
        $faktor = ($ausschnitt_breite/$ausschnitt_hoehe) * ($pixel/($ausschnitt_breite/$ausschnitt_hoehe));
        $klein_breite = floor($ausschnitt_breite/$faktor);
        $klein_hoehe = floor($ausschnitt_hoehe/$faktor);
      }
      else {
        $faktor = ($ausschnitt_hoehe/$ausschnitt_breite) * ($pixel/($ausschnitt_hoehe/$ausschnitt_breite));
        $klein_breite = floor($ausschnitt_breite/$faktor);
        $klein_hoehe = floor($ausschnitt_hoehe/$faktor);
      }
 
Zurück
Oben