2010-08-02 14 views
14

Tại sao mã này không hoạt động?Không thể hiển thị hình ảnh vì nó có chứa lỗi

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
    <head> 

     <title></title> 
    </head> 
    <body> 
     <?php 
     header('Content-type: image/png'); 
     $myImage = imagecreate(200, 100); 
     $myGray = imagecolorallocate($myImage, 204, 204, 204); 
     $myBlack = imagecolorallocate($myImage, 0, 0, 0); 
     imageline($myImage, 15, 35, 120, 60, $myBlack); 

     imagepng($myImage); 
     imagedestroy($myImage); 
     ?> 
    </body> 
</html> 

Tôi luôn gặp lỗi The image cannot be displayed because it contains errors.. Tôi đã bật php_gd2.dllmemory_limit trong php.ini cũng là 128M. Nếu tôi xóa header('Content-type: image/png'); tôi không gặp lỗi nhưng tôi cũng không thấy hình ảnh. Tất cả tôi thấy là thế này: -

‰PNG ��� IHDR���È���d���ùHíH���PLTEÌÌÌ���Ó33d���MIDATH‰c £ Àx�§” Nf*k²Ã)Ãø�§”•5}À)ÅS†ÚšpJUà”a§²¦œ2ÔŽw<špJ‚Q0 †;�� uTBúŸ����IEND®B, `

+1

Xem ra báo cáo lỗi PHP, đặc biệt là từ 5.4. Lỗi sẽ không được in trên màn hình nhưng sẽ gây ra lỗi với hình ảnh. Hãy thử 'error_reporting (0);' ở đầu mã của bạn, đã làm việc cho tôi. – Chaoley

Trả lời

23

Bạn không phải bất cứ điều gì đầu ra trước khi tiêu đề(). Chỉ cần bắt đầu tài liệu của bạn với <?php theo sau là mã để hiển thị hình ảnh. Bỏ qua các thẻ html. Thậm chí không viết một dòng trống trước tiêu đề().

Nếu bạn muốn hiển thị hình ảnh bên trong tài liệu html của bạn, bạn phải làm điều đó trong hai tệp. Một, gọi nó là ví dụ image.php, chỉ chứa mã php bao gồm tiêu đề. Tệp thứ hai, gọi nó là show.php hoặc show.html, bao gồm mã html bạn thích, bao gồm <img src="image.php" alt="Your generated image" />.

+0

Xin lỗi tôi không hiểu. Tôi cần phải thay đổi những gì? header() đã là dòng đầu tiên của php. Nếu bạn có nghĩa là tôi nên loại bỏ 'html',' đầu' vv, tôi đã cố gắng mà quá. Nếu tôi làm điều đó tôi vẫn nhận được 'hình ảnh chứa lỗi' – TCM

+0

Cảm ơn làm việc :) – TCM

+0

@Nitesh bạn không cần phải có hai tập tin. [Xem câu trả lời của tôi bên dưới để biết giải pháp nội tuyến] (http://stackoverflow.com/questions/3385982/the-image-cannot-be-displayed-because-it-contains-errors/3386050#3386050). Nó chỉ là hợp lý hơn và đáng tin cậy để có hai tập tin. – Gordon

2

Đây là tất cả những gì bạn cần. Bạn không thể in bất cứ điều gì khác bởi vì nó cần phải trông giống như tập tin riêng của nó. Bạn có thể gọi tệp image.php này và chuyển cho nó một biến để xác định hình ảnh nào xuất ra.

<?php 
    header('Content-type: image/png'); 
    $myImage = imagecreate(200, 100); 
    $myGray = imagecolorallocate($myImage, 204, 204, 204); 
    $myBlack = imagecolorallocate($myImage, 0, 0, 0); 
    imageline($myImage, 15, 35, 120, 60, $myBlack); 

    imagepng($myImage); 
    imagedestroy($myImage); 
?> 
3

Bạn nên đầu ra chỉ hình ảnh. Bạn đang xuất ra một loạt các thẻ. Cụ thể

< DOCTYPE HTML PUBLIC "- // W3C // DTD HTML 4.01 Transitional // EN">

<title></title> 
</head> 
<body> 

và sau đó là hình ảnh như một nhị phân. Nếu bạn muốn xem điều này, hãy wget trang từ máy chủ của bạn và thử mở nó trong trình chỉnh sửa. Mã của bạn sẽ bắt đầu tại <?php.

Xóa tiêu đề sẽ loại bỏ thông báo cho khách hàng rằng đây là hình ảnh để nó sẽ thử in ra dưới dạng văn bản.

9

Nếu bạn base64 mã hóa đầu ra, bạn có thể sử dụng hình ảnh trực tiếp với Data URI scheme.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
    <head> 

     <title></title> 
    </head> 
    <body> 
     <?php 

     $myImage = imagecreate(200, 100); 
     $myGray = imagecolorallocate($myImage, 204, 204, 204); 
     $myBlack = imagecolorallocate($myImage, 0, 0, 0); 
     imageline($myImage, 15, 35, 120, 60, $myBlack); 
     ob_start(); 
     imagepng($myImage); 
     printf('<img src="data:image/png;base64,%s"/>', 
       base64_encode(ob_get_clean())); 

     imagedestroy($myImage); 
     ?> 
    </body> 
</html> 

Lưu ý rằng URI dữ liệu không được tất cả trình duyệt hỗ trợ (phỏng đoán).

+1

+1. Một câu trả lời khác với phần còn lại. –

+0

Biến thể thú vị. Bạn có thể kiểm soát cách trình duyệt web nên lưu hình ảnh này không? – Johan

+1

@Johan Hình ảnh không phải là tài nguyên bên ngoài với phương pháp này. Sẽ không có tiêu đề hết hạn hay gì đó. Đó là văn bản trên trang được phân phối. Mọi bộ nhớ đệm áp dụng cho trang sẽ áp dụng cho hình ảnh. – Gordon

2

Tôi đã tách tập lệnh PHP thành tệp riêng của mình (image.php) và nó hoạt động tốt: Tôi có hình chữ nhật màu xám với đường kẻ nghiêng màu đen. Sự cố của bạn đang cố gắng nhúng nội dung này vào tệp HTML.

Bạn cần PHP riêng, tập tin riêng biệt của nó (như tôi đã làm, gọi nó là image.php hoặc một cái gì đó mô tả hơn với nhu cầu của bạn) và sau đó tạo ra một file HTML như sau:

<html> 
    <head> 
    <title>Document Title</title> 
    </head> 
    <body> 
    <img src="image.php" alt="" /> 
    </body> 
</html> 

Bạn sẽ nhận được của bạn mong muốn đầu ra sau đó.

+0

Vâng, không nhất thiết phải trong tập tin riêng của nó. Chỉ cần đầu ra không được trộn lẫn HTML và PNG. –

2

Khi cố gắng xuất jpg của ảnh hồ sơ Facebook từ API đồ thị bằng PHP, Tôi nhận thấy rằng nếu tệp PHP được lưu bằng mã hóa UTF-8 - lỗi này được trả về, nhưng nếu tệp được lưu với mã hóa ANSI - sau đó nó hoạt động OK.

+0

Cảm ơn Yuval, tất cả đã giải quyết được vấn đề của tôi. Mã hóa tệp php! – Alexar

2

Nếu bạn có vấn đề này, hãy cố gắng xóa bất kỳ ký tự khoảng trống giữa bắt đầu của kịch bản và thẻ php

> <?php 

Tôi đã dành vài giờ trước khi nhận ra điều này. Và bây giờ nó hoạt động OK. Điều này xảy ra vì bất kỳ ký tự nào trên tệp đều thay đổi định dạng png. Nó hiệu quả tuyệt vời đối với tôi.

0

Tôi đã có cùng một vấn đề và giải pháp là thay đổi bộ mã của mã từ UTF-8 thành ansi hoặc viceversa. Nếu máy chủ được đặt thành UTF-8 và mã của bạn là ansi, điều này không hoạt động và nếu mã của bạn nằm trong ansi và máy chủ được định cấu hình thành UTF-8 thì không.

3

Thậm chí nếu bạn nghĩ rằng bạn đã gỡ bỏ tất cả các văn bản từ trước khi tiêu đề() PHP tập tin của bạn có thể chứa một Byte Order Marker

Đây sẽ là ẩn với bạn trong trình soạn thảo của bạn, nhưng trình duyệt của bạn sẽ thấy nó và nghĩ rằng hình ảnh bị hỏng. Bạn cần thực hiện các bước phù hợp với trình soạn thảo của mình để xóa bất kỳ BOM nào.

0

Nếu bạn đang sử dụng Filezilla để tải lên các trang web của mình, hãy đảm bảo bạn chọn loại chuyển là 'Auto/Binary'.

Chuyển -> Loại chuyển -> Tự động/Nhị phân.

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