2015-10-13 17 views
5

example imageHì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.

problematic png image

Nó mang lại cho tôi một hình ảnh gần như đen như thế này.

very dark blue - almost black recreated image


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

manipulated transparent image

+0

"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

+0

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

+2

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

Trả lời

1

ảnh thứ hai của bạn là 8-bit, có nghĩa là nó chỉ hỗ trợ tối đa 256 màu. Điều này làm cho nó trở thành một hình ảnh 'dựa trên bảng màu' và vì vậy nó không hỗ trợ tính trong suốt của alpha.

Bởi chỉ cần thêm dòng sau sau khi tạo $image bạn có thể khắc phục vấn đề:

imagepalettetotruecolor($image); 

này không có bất kỳ ảnh hưởng đến hình ảnh mà đã có màu sắc trung thực, vì vậy grass.png tiếp tục được xử lý một cách chính xác. Từ số PHP manual page:

Trả về TRUE nếu quá trình chuyển đổi hoàn thành hoặc nếu hình ảnh nguồn đã đúng là màu, nếu không thì FALSE được trả về.

+0

Chắc chắn hoạt động, bất kỳ ý tưởng tại sao hình ảnh 32kb trở thành 119kb khi giải trí. ? – gurung

+1

Vì nó được lưu dưới dạng hình ảnh 32 bit, thay vì định dạng 8 bit ban đầu. Bạn sẽ cần phải đảo ngược thao tác với ['imagetruecolortopalette'] (http://php.net/manual/en/function.imagetruecolortopalette.php) để giảm kích thước tệp một lần nữa. – timclutton

Các vấn đề liên quan