2011-04-22 75 views
0

若跌破該功能適用​​於大部分或根本沒有。我試圖通過像素循環並切換顏色,同時保持alpha。我認爲我一直在工作,直到我將頁面背景變成白色,並在圖標周圍看到一個小邊框。PHP GD - 顏色替換使用Alpha給圖像我不知道邊界

我認爲問題是,顏色被施加到半透明像素。因此,白色在圖像的消除鋸齒的部分上變成灰色。然後我決定在設置新顏色之前使像素完全透明。這沒有做什麼。

於是問題。爲什麼白色圖像有一個小邊框?

顏色轉換函數。

function updateThumb($image, $newColor) { 
    $img = imagecreatefrompng($image); 

    $w = imagesx($img); 
    $h = imagesy($img); 

    // Work through pixels 
    for($y=0;$y<$h;$y++) { 
     for($x=0;$x<$w;$x++) { 
      // Apply new color + Alpha 
      $rgb = imagecolorsforindex($img, imagecolorat($img, $x, $y)); 

     $transparent = imagecolorallocatealpha($img, 0, 0, 0, 127); 
     imagesetpixel($img, $x, $y, $transparent); 

      $pixelColor = imagecolorallocatealpha($img, $newColor[0], $newColor[1], $newColor[2], $rgb['alpha']); 
      imagesetpixel ($img, $x, $y, $pixelColor); 
     } 
    } 

    // Restore Alpha 
    imageAlphaBlending($img, true); 
    imageSaveAlpha($img, true); 

    return $img; 
} 

大拇指需要一個翻轉效果,所以圖像是在下面的功能。我不認爲這與問題有關,我試圖改變上述功能來創建圖像,而不是返回它,併發生同樣的事情。

function makeThumb($path, $top, $bottom=FALSE) { 
    $width = imagesx($top); 
    $height = imagesy($top); 

    $thumbHeight = $bottom != FALSE ? $height * 2 : $height; 

    // Create Transparent PNG 
    $thumb = imagecreatetruecolor($width, $thumbHeight); 
    $transparent = imagecolorallocatealpha($thumb, 0, 0, 0, 127); 
    imagefill($thumb, 0, 0, $transparent); 

    // Copy Top Image 
    imagecopy($thumb, $top, 0, 0, 0, 0, $width, $height); 

    // Copy Bottom Image 
    if ($bottom != FALSE) { 
     imagecopy($thumb, $bottom, 0, $height, 0, 0, $width, $height); 
    } 

    // Save Image with Alpha 
    imageAlphaBlending($thumb, true); 
    imageSaveAlpha($thumb, true); 
    imagepng($thumb, $path); // save image as gif 

} 

函數被稱爲像這樣...

$thumbTop = updateThumb('Path/To/Thumb', array(255,255,255)); 
makeThumb('output/path', $thumbTop); 

這是圖標:http://img171.imageshack.us/i/iconkc.png/

任何想法?

回答

1

OMG THANK YOU FOR CODE OF此位!!!! :D還有其他的我也要感謝,但我無法在這個網站上找到他們的代碼。我拿了你的代碼和另一個人的代碼併合並它們。我注意到,您保存圖像,我還沒有想出如何保存其他然後點擊右鍵,通過瀏覽器保存的彩色圖像,但圖像會改變顏色。

function updateThumb($image, $newColor) { 
    $img = imagecreatefrompng($image); 

    $w = imagesx($img); 
    $h = imagesy($img); 

    // Work through pixels 
    for($y=0;$y<$h;$y++) { 
     for($x=0;$x<$w;$x++) { 
      // Apply new color + Alpha 
      $rgb = imagecolorsforindex($img, imagecolorat($img, $x, $y)); 

      $transparent = imagecolorallocatealpha($img, 0, 0, 0, 127); 
      imagesetpixel($img, $x, $y, $transparent); 


      // Here, you would make your color transformation. 
      $red_set=$newColor[0]/100*$rgb['red']; 
      $green_set=$newColor[1]/100*$rgb['green']; 
      $blue_set=$newColor[2]/100*$rgb['blue']; 
      if($red_set>255)$red_set=255; 
      if($green_set>255)$green_set=255; 
      if($blue_set>255)$blue_set=255; 

      $pixelColor = imagecolorallocatealpha($img, $red_set, $green_set, $blue_set, $rgb['alpha']); 
      imagesetpixel ($img, $x, $y, $pixelColor); 
     } 
    } 

    // Restore Alpha 
    imageAlphaBlending($img, true); 
    imageSaveAlpha($img, true); 

    return $img; 
} 

function makeThumb($path, $top, $bottom=FALSE) { 
    $width = imagesx($top); 
    $height = imagesy($top); 

    $thumbHeight = $bottom != FALSE ? $height * 2 : $height; 

    // Create Transparent PNG 
    $thumb = imagecreatetruecolor($width, $thumbHeight); 
    $transparent = imagecolorallocatealpha($thumb, 0, 0, 0, 127); 
    imagefill($thumb, 0, 0, $transparent); 

    // Copy Top Image 
    imagecopy($thumb, $top, 0, 0, 0, 0, $width, $height); 

    // Copy Bottom Image 
    if ($bottom != FALSE) { 
     imagecopy($thumb, $bottom, 0, $height, 0, 0, $width, $height); 
    } 

    // Save Image with Alpha 
    imageAlphaBlending($thumb, true); 
    imageSaveAlpha($thumb, true); 
    header('Content-Type: image/png'); 
    imagepng($thumb, $path); // save image as png 

} 

$thumbTop = updateThumb('input/path', array(240,105,15)); 
makeThumb('output/path', $thumbTop); 
1

謝謝!你激勵我在我正在構建的圖像工作者中逐像素地使用像素。 起初,我有同樣的問題,但我想我找到了如何解決它。

問題

,在我看來,好像imagesetpixel不更換新的RGBA值的像素,而是把他們交給舊的。

解決方案

function updateThumb($image, $newColor) { 
    $img = imagecreatefrompng($image); 

    $w = imagesx($img); 
    $h = imagesy($img); 

    // create a new blank image. 
    $target = imagecreatetruecolor($w, $h); 
    $transparent = imagecolorallocatealpha($target, 0, 0, 0, 127); 
    imagefill($target, 0, 0, $transparent); 

    // Work through pixels 
    for($y=0;$y<$h;$y++) { 
     for($x=0;$x<$w;$x++) { 
      // Apply new color + Alpha 
      $rgb = imagecolorsforindex($img, imagecolorat($img, $x, $y)); 

      // and set the new color to the blank image. 
      $pixelColor = imagecolorallocatealpha($target, $newColor[0], $newColor[1], $newColor[2], $rgb['alpha']); 
      imagesetpixel($target, $x, $y, $pixelColor); 
     } 
    } 

    // Restore Alpha 
    imageAlphaBlending($target, true); 
    imageSaveAlpha($target, true); 

    return $target; 
} 

出了什麼問題:

// new image 
$target = imagecreatetruecolor(1, 1); 

// Set a Pixel 
$pixelColor = imagecolorallocatealpha($target, 0, 0, 0, 60); 
imagesetpixel($target, 0, 0, $pixelColor); 

// "Replace" The Pixel 
$pixelColor = imagecolorallocatealpha($target, 255, 255, 255, 60); 
imagesetpixel($target, 0, 0, $pixelColor); 

// See the rgba values of the pixel 
var_dump(imagecolorsforindex($target, imagecolorat($target, 0, 0))); 

預計:

array(4) { 
    ["red"]=> int(255) 
    ["green"]=> int(255) 
    ["blue"]=> int(255) 
    ["alpha"]=> int(60) 
} 

實際:

array(4) { 
    ["red"]=> int(174) 
    ["green"]=> int(174) 
    ["blue"]=> int(174) 
    ["alpha"]=> int(28) 
} 
+0

直到我找到這個,我一直在努力解決同樣的問題。謝謝! – 2017-09-29 10:43:02