Nasıl görüntülerde saydam yapmak için bir renk seçmek için?

1 Cevap php

İlk soru, lütfen nazik olun ;-)

I've written an image class that makes simple things (rectangles, text) a bit easier, basically a bunch of wrapper methods for PHP's image functions.
What I'm trying to do now is to allow the user to define a selection, and have the following image operations only affect the selected area. I figured I'd do this by copying the image to imgTwo and deleting the selected area from it, do the following image operations on the original as usual, then when $img->deselect() is called, copy imgTwo back to the original, and destroy the copy.

  • Bu en iyi yolu nedir? Açıkçası seçilmiş bir alan içinde, seçimi kaldırılan alanları tanımlamak için zor olacak ama ben şimdi bununla yaşayabilirim :)

Sonra, ben kopyadan seçimi siliyorum yolu çalışan şeffaf bir renk, bir dikdörtgen çizerek - ama emin olurken onu farkeder nasıl choose bu renk bilemiyorum 't görüntünün geri kalanı meydana gelir. Bu uygulamada giriş görüntüleri gerçek renk PNG, yani renk indeksleri ile hiçbir palet (sanırım?) Vardır.

  • Doğru .. her pikselin renklerini toplamak ve daha sonra $ existing_colours dizide görünmeyen bir renk bulmak için daha iyi bir yolu olmalı?

1 Cevap

Kod bu gibi bakarak sona erdi:

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

Meraklı olanlar için, burada iki sınıf vardır:

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)