Hình ảnh png được chụp lại là màu đen
Lưu ý: SO đã chuyển đổi hình ảnh tham chiếu trên thành jpeg. Đây là transparent PNG.
Sau đây là một ví dụ mã mà tái tạo lại một hình ảnh png trên vải mới và bảo tính minh bạch. Như bạn có thể thấy, nó cũng cho phép thao tác mức pixel ví dụ. với chức năng tùy chỉnh như custom_func($r, $g, $b)
, được minh họa tốt hơn ở cuối câu hỏi này.
Về cơ bản mã này tạo lại/vẽ lại hình ảnh trên trên canvas mới thành công như cũ. Xin lưu ý rằng bầu trời đó hoàn toàn trong suốt ở hình ảnh trên.
$image = imagecreatefrompng('grass.png');
$x_dimension = imagesx($image);
$y_dimension = imagesy($image);
$new_image = imagecreatetruecolor($x_dimension, $y_dimension);
// create a transparent canvas
$trans_color = imagecolorallocatealpha($new_image, 0x00, 0x00, 0x00, 127);
imagefill($new_image, 0, 0, $trans_color);
for ($x = 0; $x < $x_dimension; $x++) {
for ($y = 0; $y < $y_dimension; $y++) {
$rgb = imagecolorat($image, $x, $y);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
$alpha = ($rgb & 0x7F000000) >> 24;
//$pixel = custom_function($r, $g, $b);
imagesetpixel($new_image, $x, $y, imagecolorallocatealpha($image, $r, $g, $b, $alpha));
}
}
imagesavealpha($new_image, true);
imagepng($new_image, 'grass-result.png');
Tuy nhiên khi tôi chạy cùng mã trên hình ảnh này png đặc biệt dưới đây.
Nó mang lại cho tôi một hình ảnh gần như đen như thế này.
Tôi muốn hiểu những gì đang xảy ra ở đây và tại sao? Quan trọng nhất, tôi muốn biết về các yếu tố có thể ảnh hưởng đến quá trình, vì vậy tôi có thể nhìn vào nó. Tại sao kết quả lại khác với png này sang png khác?
Lý tưởng nhất, tôi muốn mã của mình có thể bảo toàn và chuyển trạng thái trong suốt (trong suốt, nửa trong suốt hoặc mờ đục) của hình ảnh png nguồn thành hình ảnh được tạo lại. Như bạn có thể thấy, tôi đã có thể đạt được nó, ngoại trừ trường hợp trên.
Chỉ trong trường hợp, đây là môi trường của tôi. Windows 7 - 64 bit ** Wampserver2.5 ** Apache-2.4.9 ** Mysql-5.6.17 ** php5.5.12-64b. Ngoài ra đây là một var_dump của hình ảnh với getimagesize()
:
array (size=6)
0 => int 228
1 => int 230
2 => int 3
3 => string 'width="228" height="230"' (length=24)
'bits' => int 8
'mime' => string 'image/png' (length=9)
CẬP NHẬT Dưới đây là bằng chứng cho thấy hình ảnh ví dụ thực sự minh bạch và còn là nó có thể được thao tác, trong khi vẫn giữ tính minh bạch. Chú ý đáy của hình ảnh bây giờ hơi nâu hơn. Điều này đã được thực hiện bằng một sửa đổi nhỏ của dòng này imagesetpixel($new_image, $x, $y, imagecolorallocatealpha($image, 100, $g, $b, $alpha));
"Xin lưu ý rằng bầu trời đó hoàn toàn trong suốt trong hình trên." Không, không phải vậy. Hãy thử nhìn nó trên nền không trắng. – timclutton
Và đó là JPG. Mã của bạn mong đợi PNG. Bạn đã tải lên tệp chính xác chưa? – timclutton
Không biết SO chuyển đổi png sang .jpegs. Dù sao, tôi sẽ cập nhật các bài viết ngay bây giờ với bằng chứng. – gurung