Я перебираю все пиксели изображения (изображение к этому моменту гарантированно равно png, поэтому сжатие изображения в формате jpeg не учитывается), чтобы я мог изменять значения цвета для каждого пикселя. Это прекрасно работает таким образом:
$colors = imagecolorat($imageToModify, $x, $y);
$r = ($colors >> 16) & 0xFF;
$g = ($colors >> 8) & 0xFF;
$b = $colors & 0xFF;
$newR = 100;
echo "Pre: ".$newR." ";
// will show the 100, as I changed the color
$newColor = imagecolorallocate($imageToModify, $newR, $g, $b);
imagesetpixel($imageToModify, $x, $y, $newColor);
$colors = imagecolorat($imageToModify, $x, $y);
$r = ($colors >> 16) & 0xFF;
$g = ($colors >> 8) & 0xFF;
$b = $colors & 0xFF;
echo "Post: ".$r." ";
// Should echo what is shown above
Это работало хорошо. Однако, скажем, значение цвета $ r исходного пикселя равно 0, подобно изображению, которое я включил в качестве приложения к этому вопросу, последняя строка эха все равно будет возвращать 0, как если бы imagesetpixel()
не изменил цвет изображения.
Опять же, это делается внутри цикла следующим образом:
for($i=0;$i<strlen($binaryGiven);$i++) {
if($i == 0) {
$x = 0;
} else {
$x = $i % $width;
}
if($i == 0) {
$y = 0;
} else {
$y = $i / $width;
}
Таким образом, цикл просто проходит через пиксели, как при чтении по-английски, слева направо до конца, где он переходит на следующую строку. Я не уверен, что это актуально, но именно здесь imagesetpixel()
происходит.
Опять же, это работает в любой ситуации, если только изображение не черное с 0 в качестве значений rgb. Я приложил образец изображения.
Любые идеи, почему это не работает, как описано?
Задача ещё не решена.
Других решений пока нет …