2012-08-29 40 views
7

Tôi đã cố gắng minh bạch để làm việc với ứng dụng của mình (tự động định lại kích thước hình ảnh trước khi lưu trữ) và tôi nghĩ cuối cùng tôi đã thu hẹp vấn đề sau nhiều sự nhầm lẫn về imagealphablendingimagesavealpha. Hình ảnh nguồn không bao giờ được nạp với độ trong suốt phù hợp!PHP GD imagecreatefromstring discards minh bạch

// With this line, the output image has no transparency (where it should be 
// transparent, colors bleed out randomly or it's completely black, depending 
// on the image) 
$img = imagecreatefromstring($fileData); 
// With this line, it works as expected. 
$img = imagecreatefrompng($fileName); 

// Blah blah blah, lots of image resize code into $img2 goes here; I finally 
// tried just outputting $img instead. 

header('Content-Type: image/png'); 
imagealphablending($img, FALSE); 
imagesavealpha($img, TRUE); 
imagepng($img); 

imagedestroy($img); 

Sẽ là một số khó khăn về kiến ​​trúc nghiêm trọng khi tải hình ảnh từ tệp; mã này đang được sử dụng với API JSON được truy vấn từ ứng dụng iPhone và dễ dàng hơn trong trường hợp này (và nhất quán hơn) để tải lên hình ảnh dưới dạng chuỗi được mã hóa base64 trong dữ liệu POST. Tôi có hoàn toàn cần bằng cách nào đó lưu trữ hình ảnh dưới dạng tệp (chỉ để PHP có thể tải nó vào bộ nhớ một lần nữa)? Có cách nào để tạo Luồng từ $fileData có thể được chuyển đến imagecreatefrompng không?

+0

Không thể tạo lại sự cố trên 'PHP 5.3.10/GD 2.0', Làm việc tốt. Bạn đang sử dụng phiên bản nào? Có thể đến từ một thứ khác .. Mục nhập PNG bị hỏng? Giống như ứng dụng iPhone tải lên hình ảnh có chất lượng kém? Chỉ những bức ảnh trong bóng tối – Touki

+0

Tôi đã thử nghiệm điều này trên 'PHP 5.3.16-1 ~ dotdeb.0' (với Suhosin) với' GD 2.0.34' (tương thích 2.0.34) trên hộp Debian của tôi, và khi tôi chạy 'imagepng 'các phần trong suốt là màu đen. Điều này xảy ra khi tôi sử dụng 'imagecreatefromstring' hoặc' imagecreatefrompng'. –

+0

Tôi đang ở trong PHP 5.3.10/GD (2.0.34 tương thích). – meustrus

Trả lời

5

Blech, điều này hóa ra cuối cùng được do một cuộc gọi GD hoàn toàn riêng biệt đã xác thực tải lên hình ảnh. Tôi đã quên thêm imagealphablendingimagesavealpha vào mã THAT và nó đã tạo một hình ảnh mới sau đó được chuyển đến mã thay đổi kích thước. Mà có lẽ nên được thay đổi anyway. Cảm ơn rất nhiều đến goldenparrot cho phương pháp tuyệt vời để chuyển đổi chuỗi thành tên tệp.

+0

tất cả nhờ vào php-devs/\ – Prasanth

2

Tôi hoàn toàn có cần lưu trữ hình ảnh dưới dạng tệp không (chỉ để PHP có thể tải nó vào bộ nhớ một lần nữa)?

số

Documentation nói:

Bạn có thể sử dụng giao thức data:// từ php v5.2.0

Ví dụ:

// prints "I love PHP" 
echo file_get_contents('data://text/plain;base64,SSBsb3ZlIFBIUAo='); 
+1

Bạn sẽ có thể làm '$ img = imagecreatefrompng ('dữ liệu: // image/png; base64, '. $ base64Image); ' –

2

bạn có thể sử dụng mã này:

$new = imagecreatetruecolor($width, $height); 

// preserve transparency 

imagecolortransparent($new, imagecolorallocatealpha($new, 0, 0, 0, 127)); 

imagealphablending($new, false); 

imagesavealpha($new, true); 

imagecopyresampled($new, $img, 0, 0, $x, 0, $width, $height, $w, $h); 

imagepng($new); 

imagedestroy($new); 

Nó sẽ làm cho một hình ảnh trong suốt cho bạn. Chúc may mắn !

+1

Bạn có thực sự đọc câu hỏi hoặc bất kỳ câu trả lời nào không? – meustrus

+0

Điều này đặt tất cả cùng nhau cho tôi. Cảm ơn. –

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