Как выбрать цвет, чтобы сделать прозрачными изображения? - PullRequest
3 голосов
/ 26 июня 2009

Первый вопрос, пожалуйста, будьте нежны; -)

Я написал класс изображений, который немного упрощает простые вещи (прямоугольники, текст), в основном набор методов-оболочек для функций изображений PHP.
Сейчас я пытаюсь разрешить пользователю определять выделение, а следующие операции с изображениями влияют только на выделенную область. Я решил, что сделаю это, скопировав изображение в imgTwo и удалив из него выделенную область, как обычно, выполняя следующие операции с изображением на оригинале, затем, когда вызывается $ img-> deselect (), копирует imgTwo обратно в оригинал и уничтожить копию.

  • это лучший способ? очевидно, будет сложно определить невыбранные области в пределах выделенной области, но я могу жить с этим сейчас:)

Затем я стираю выделение из копии, рисуя прямоугольник прозрачного цвета, и это работает, но я не могу понять, как выбрать этот цвет, будучи уверен, что это не происходит в остальной части изображения. Входные изображения в этом приложении являются настоящими цветными PNG, поэтому нет палитры с цветовыми индексами (я думаю?).

  • Должен быть лучший способ, чем собирать цвета для каждого отдельного пикселя, а затем находить цвет, который не отображается в массиве $ Существующий_цвет. .. верно?

Ответы [ 2 ]

3 голосов
/ 26 июня 2009

Прозрачность PNG работает иначе, чем прозрачность GIF - вам не нужно определять определенный цвет как прозрачный. Просто используйте imagecolorallocatealpha() и убедитесь, что вы установили 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);
0 голосов
/ 28 июня 2009

Код в итоге выглядел так:

# -- 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;
  }
}

Для тех, кому интересно, вот два класса:

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)
...