Frage

Die erste Frage, bitte sanft, -)

Ich habe eine Bildklasse geschrieben, die einfachen Dinge (Rechtecken, Text) ein bisschen einfacher, im Grunde eine Reihe von Wrapper-Methoden für die PHP-Bildfunktionen macht.
Was ich versuche jetzt zu tun ist, damit der Benutzer eine Auswahl zu definieren, und hat die folgenden Bildoperationen den ausgewählten Bereich nur beeinflussen. Ich dachte, ich dies tun würde, indem das Bild auf imgTwo Kopieren und den markierten Bereich aus sie zu löschen, führen Sie die folgenden Bildoperationen auf dem Original wie gewohnt, dann, wenn $ IMG-> deselect () aufgerufen wird, kopieren imgTwo wieder auf den ursprünglichen und die Kopie zerstören.

  • ist dies der beste Weg? offensichtlich wird es schwierig sein abgewählten Bereiche innerhalb eines ausgewählten Bereichs zu definieren, aber ich kann jetzt damit leben:)

Dann, so wie ich die Auswahl aus der Kopie bin Löschen ist durch ein Rechteck in einer transparenten Farbe zeichnen, die funktionieren - aber ich kann nicht herausfinden, wie man wählen , die Farbe, während sein sicher, dass es nicht in dem Rest des Bildes auftritt. Die Eingangsbilder in dieser Anwendung sind wahre Farbe PNGs, so dass keine Palette mit Farbe Indizes (glaube ich?).

  • Es muss ein besserer Weg sein, als die Farben jeden einzelnen Pixels zu sammeln und dann eine Farbe zu finden, die nicht in dem $ existing_colours Array angezeigt wird .. richtig?
War es hilfreich?

Lösung

PNG Transparenz funktioniert anders zu GIF Transparenz - Sie müssen nicht eine bestimmte Farbe als transparent definiert werden müssen. Verwenden Sie einfach imagecolorallocatealpha() und stellen Sie sicher, Sie haben festgelegt imagealphablending() false:

// "0, 0, 0" can be anything; 127 = completely transparent
$c = imagecolorallocatealpha($img, 0, 0, 0, 127);

// Set this to be false to overwrite the rectangle instead of drawing on top of it
imagealphablending($img, false);

imagefilledrectangle($img, $x, $y, $width - 1, $height - 1, $c);

Andere Tipps

Der Code am Ende aussehen wie folgt aus:

# -- select($x, $y, $x2, $y2)
function select($x, $y, $x2, $y2) {
  if (! $this->selected) { // first selection. create new image resource, copy current image to it, set transparent color
    $this->copy = new MyImage($this->x, $this->y); // tmp image resource
    imagecopymerge($this->copy->img, $this->img, 0, 0, 0, 0, $this->x, $this->y, 100); // copy the original to it
    $this->copy->trans = imagecolorallocatealpha($this->copy->img, 0, 0, 0, 127); // yep, it's see-through black
    imagealphablending($this->copy->img, false);                                  // (with alphablending on, drawing transparent areas won't really do much..)
    imagecolortransparent($this->copy->img, $this->copy->trans);                  // somehow this doesn't seem to affect actual black areas that were already in the image (phew!)
    $this->selected = true;
  }
  $this->copy->rect($x, $y, $x2, $y2, $this->copy->trans, 1); // Finally erase the defined area from the copy
}

# -- deselect()
function deselect() {
  if (! $this->selected) return false;
  if (func_num_args() == 4) { // deselect an area from the current selection
    list($x, $y, $x2, $y2) = func_get_args();
    imagecopymerge($this->copy->img, $this->img, $x, $y, $x, $y, $x2-$x, $y2-$y, 100);
  }else{ // deselect everything, draw the perforated copy back over the original
    imagealphablending($this->img, true);
    imagecopymerge($this->img, $this->copy->img, 0, 0, 0, 0, $this->x, $this->y, 100); // copy the copy back
    $this->copy->__destruct();
    $this->selected = false;
  }
}

Für diejenigen neugierig, hier sind die zwei Klassen:

http://dev.expocom.nl/functions.php?id=104 (image.class.php)
http://dev.expocom.nl/functions.php?id=171 (MyImage.class.php extends image.class.php)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top