2012-01-10 27 views
8

Tôi đang cố gắng tạo một cách để hiển thị hình ảnh được tạo bằng PHP/GD, theo kiểu OOP. Để thực hiện điều đó, tôi đã tạo ra một lớp học, trong số những thứ khác, tạo ra một hình ảnh. Một cái gì đó như thế này:Tôi có thể hiển thị hình ảnh được tạo bằng PHP/GD mà không lưu và không sử dụng PHP bên ngoài với tiêu đề hình ảnh không?

<?php 
    class MyClass 
    { 
     public $image; 
     function __construct() 
     { 
      ... 
      $this->image = imagecreatetruecolor(100,100); 
      $bg = imagecolorallocate($this->image,100,100,100); 
      imagefilledrectangle($this->image,0,0,100,100,$bg); 
      ... 
     } 
     ... 
    } 

    $myvar = new MyClass 
?> 

Tôi đã cố tạo một hàm trong lớp sẽ xuất hình ảnh. Một cái gì đó như thế này:

function show() 
{ 
    echo "<img src='" . imagejpeg($this->image,100) . "' />"; 
} 

nhưng nó không hoạt động. Tôi cũng đã thử

function show() 
{ 
    echo "<img src='data:image/jpeg;base64," . imagejpeg($this->image,100) . "' />"; 
} 

nhưng điều này cũng không hiệu quả. Ý tưởng là chỉ cần gọi hàm từ HTML. Như thế này:

<div id='anyid'> 
    <?php $myvar->show(); ?> 
</div> 

Tôi có hoàn toàn sai về điều này không? Có cách nào để hoàn thành những gì tôi muốn không? Tôi đã cố gắng nghĩ về một cách để sử dụng img = 'mycode.php' nhưng nó không hoạt động đối với tôi vì lớp đó phải được tạo trước khi tải trang và hình ảnh xuất hiện một nửa thông qua trang.

Cảm ơn.

+0

Bạn gần như đã có nó với chương trình() - bạn chỉ cần base64_encode đầu ra – Aknosis

Trả lời

26

Trước tiên, bạn cần phải chèn thông số thứ hai vào imagejpeg() để cho phép 100 trở thành thông số chất lượng. Sau đó, bạn cần phải base64 mã hóa các byte thô:

public function show() { 

     // Begin capturing the byte stream 
     ob_start(); 

     // generate the byte stream 
     imagejpeg($this->image, NULL, 100); 

     // and finally retrieve the byte stream 
     $rawImageBytes = ob_get_clean(); 

     echo "<img src='data:image/jpeg;base64," . base64_encode($rawImageBytes) . "' />"; 

    } 

Các data:image/jpeg;base64 đòi hỏi sự byte thô để có được mã hóa dưới dạng base64.

Ngoài ra, tôi đề nghị thực hiện $image biến số protected, vì tôi cho rằng nó được tạo và duy trì chỉ bên trong MyClass.

+0

Cảm ơn SteAp. Tôi đã thử, nhưng khi tôi nhìn vào mã html, những gì tôi nhận được là ** ** –

+1

Hàm imagejpeg() sẽ phải được bao bọc với chức năng đệm đầu ra để nắm bắt nội dung, bạn có thể tìm thấy tệp có tên "100" có hình ảnh của bạn trong thư mục trang web của bạn, imagejpeg() chỉ có thể echo hoặc ghi vào tệp, không trả về :) – Scuzzy

+0

@Scuzzy Lỗi của tôi. Truyền NULL như tham số thứ hai để cho phép 100 là tham số thứ ba. – SteAp

1

Một dòng mã duy nhất, giải quyết cho tôi sau 3 giờ tìm kiếm mù!

... 
ob_start(); 
header("Content-type: image/jpeg"); <br/> 
imagejpeg($this->img, NULL, $qualidade);<br/> 
imagedestroy($this->img);<br/> 
$i = ob_get_clean();<br/> 

echo "<img src='data:image/jpeg;base64," . base64_encode($i)."'>"; //saviour line! 

thks!

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