-
- if($in = fopen('php://input', "rb"))
- while($buff = fread($in, 4096))
- fwrite('e:\1.jpg' , $buff);
-
コードをコピー
画像情報を取得するには、getimagesize($filename) して、閉じたばかりのファイルを再度開くことが唯一の方法です。
php には getimagesizefromstring がありますが、これには php5.4 以上が必要です。
データストリームを直接操作する方法はありますか?
答えは「はい」です。PHP の公式マニュアルには「サポートされるプロトコルとカプセル化プロトコル」があり、その中の data:// は誰にとっても馴染みのあるものです。
これを使用して、データ ストリーム内の画像 (透かし、サムネイルなど) を直接操作できます。
便宜上、次のコードは直接 file_get_contents() です。
- $file_path = 'http://www.baidu.com/img/shouye_b5486898c692066bd2cbaeda86d74448.gif';
- $stream = file_get_contents($file_path);
- print_r(getimagesize( 「データ: //text/plain;base64," .base64_encode($stream)));
- $new_img = imagecreatefromgif("data://text/plain;base64," .base64_encode($stream));//または $new_img = imagecreatefromstring($stream);
- print_r($new_img);
- imagejpeg($new_img, 'E:WEBuploadstest.jpg', 100);
-
コードをコピー 形式は正常に変換されました。
この方法は良いですが、base64 は見た目があまり良くありません。
より単純なメソッド、stream_register_wrapper を検討できます。これは、PHP クラスで実装された URL ラッパー プロトコルを登録します。
コード:
class getImgStream{ -
- private $imgStream;
- private $position;
-
- function stream_open($path, $mode, $options, &$opened_path){
- $url = parse_url($path);
- $this->imgStream = $GLOBALS[$url["host"]];
- $this->position = 0;
- return true;
- }
関数 stream_read($count){
- $ret = substr($this->imgStream, $this->position, $count);
- $this->position += strlen($ret) ;
- return $ret;
- }
- function stream_stat(){
- //maxmemory: 5 * 1024 * 1024;
- $fp = fopen("php://temp/maxmemory:5242880", 'r+');
- fwrite ($fp, $this->imgStream);
- $fstat = fstat($fp);
- fclose($fp);
- return $fstat;
- }
{
- return $this->position >= strlen($this->imgStream);
- }
function stream_tell(){
- return $this->position;
- }
- function stream_close(){
- unset($this->imgStream, $this->position);
- }
- }
$file_path = 'http://www.baidu. com/img/shouye_b5486898c692066bd2cbaeda86d74448.gif';
- $stream = file_get_contents($file_path);
stream_wrapper_register("image", "getImgStream");
- < p> print_r(getimagesize('image://stream'));
- $new_img = imagecreatefromgif('image://stream');//または $new_img = imagecreatefromstring($stream);
- print_r($new_img);
- imagejpeg ($new_img, 'E:WEBuploadstest.jpg', 100);
-
-
コードをコピー
この関数は PHP 4 >= 4.3.0、PHP 5 をサポートしているため、驚くことではありません。
テスト後、同じローカル画像 (300x800)、平均方法 1 は 43 ミリ秒、平均方法 2 は 39 ミリ秒です
訂正:
getimagesize によって報告されたストリームがシークをサポートしていない場合は、シーク操作をラッパーに追加し、次のコードを追加する必要がある場合があります。
- function stream_seek($offset, $whence){
- $l = strlen($this->imgStream);
- $p = &$this->position;
- switch($whence){
- case SEEK_SET: $newPos = $offset;
- ブレーク;
- case SEEK_CUR: $newPos = $p + $offset;
- ブレーク;
- case SEEK_END: $newPos = $l + $offset;
- ブレーク;
- デフォルト: return false;
- }
- $ret = ($newPos >= 0 && $newPos if($ret)
- $p = $newPos;
- return $ret;
- }
-
コードをコピー
|