PHP擷取遠程圖片尺寸和大小的方法

來源:互聯網
上載者:User
這篇文章主要介紹了 PHP高效擷取遠程圖片尺寸和大小的實現方法的相關資料,希望通過本文大家能夠實現這樣的功能,需要的朋友可以參考下

PHP高效擷取遠程圖片尺寸和大小的實現方法

在這裡分享一下自己的心得,希望和大家一起分享技術,如果有什麼不足,還請大家指正。寫出這篇目的,就是希望大家一起成長,我也相信技術之間沒有高低,只有互補,只有分享,才能使彼此更加成長。

實現代碼:

/**  * 擷取遠程圖片的寬高和體積大小  *  * @param string $url 遠程圖片的連結  * @param string $type 擷取遠程圖片資源的方式, 預設為 curl 可選 fread  * @param boolean $isGetFilesize 是否擷取遠程圖片的體積大小, 預設false不擷取, 設定為 true 時 $type 將強製為 fread  * @return false|array  */ function myGetImageSize($url, $type = 'curl', $isGetFilesize = false)  {   // 若需要擷取圖片體積大小則預設使用 fread 方式   $type = $isGetFilesize ? 'fread' : $type;      if ($type == 'fread') {     // 或者使用 socket 二進位方式讀取, 需要擷取圖片體積大小最好使用此方法     $handle = fopen($url, 'rb');       if (! $handle) return false;       // 只取頭部固定長度168位元組資料     $dataBlock = fread($handle, 168);   }   else {     // 據說 CURL 能緩衝DNS 效率比 socket 高     $ch = curl_init($url);     // 逾時設定     curl_setopt($ch, CURLOPT_TIMEOUT, 5);     // 取前面 168 個字元 通過四張測試圖讀取寬高結果都沒有問題,若擷取不到資料可適當加大數值     curl_setopt($ch, CURLOPT_RANGE, '0-167');     // 跟蹤301跳轉     curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);     // 返回結果     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);       $dataBlock = curl_exec($ch);       curl_close($ch);       if (! $dataBlock) return false;   }     // 將讀取的圖片資訊轉化為圖片路徑並擷取圖片資訊,經測試,這裡的轉化設定 jpeg 對擷取png,gif的資訊沒有影響,無須分別設定   // 有些圖片雖然可以在瀏覽器查看但實際已被損壞可能無法解析資訊    $size = getimagesize('data://image/jpeg;base64,'. base64_encode($dataBlock));   if (empty($size)) {     return false;   }     $result['width'] = $size[0];   $result['height'] = $size[1];     // 是否擷取圖片體積大小   if ($isGetFilesize) {     // 擷取檔案資料流資訊     $meta = stream_get_meta_data($handle);     // nginx 的資訊儲存在 headers 裡,apache 則直接在 wrapper_data      $dataInfo = isset($meta['wrapper_data']['headers']) ? $meta['wrapper_data']['headers'] : $meta['wrapper_data'];       foreach ($dataInfo as $va) {       if ( preg_match('/length/iU', $va)) {         $ts = explode(':', $va);         $result['size'] = trim(array_pop($ts));         break;       }     }   }     if ($type == 'fread') fclose($handle);     return $result; }   // 測試的圖片連結 echo '<pre>'; $result = myGetImageSize('http://s6.mogujie.cn/b7/bao/120630/2kpa6_kqywusdel5bfqrlwgfjeg5sckzsew_345x483.jpg_225x999.jpg', 'curl'); print_r($result); echo '<hr />'; $result = myGetImageSize('http://s5.mogujie.cn/b7/bao/120629/6d3or_kqytasdel5bgevsugfjeg5sckzsew_801x1193.jpg', 'fread'); print_r($result); echo '<hr />'; $result = myGetImageSize('http://hiphotos.baidu.com/zhengmingjiang/pic/item/1c5f338c6d22d797503d92f9.jpg', 'fread', true); print_r($result); echo '<hr />'; $result = myGetImageSize('http://www.vegandocumentary.com/wp-content/uploads/2009/01/imveganlogotransparentbackground.png', 'curl', true); print_r($result);

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.