欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

php中如何實(shí)現(xiàn)照片旋轉(zhuǎn)-創(chuàng)新互聯(lián)

這篇文章給大家分享的是有關(guān)php中如何實(shí)現(xiàn)照片旋轉(zhuǎn) 的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。

成都創(chuàng)新互聯(lián)公司專注于隆回企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè)公司,購(gòu)物商城網(wǎng)站建設(shè)。隆回網(wǎng)站建設(shè)公司,為隆回等地區(qū)提供建站服務(wù)。全流程按需求定制開(kāi)發(fā),專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務(wù)

前言

iPhone和一些數(shù)碼相機(jī)在拍照的時(shí)候往往會(huì)在圖片里面加入很多的照片信息(exif),比如拍照時(shí)間、光圈大小、曝光時(shí)間、GSP地理信息以及拍攝時(shí)相機(jī)傾斜狀態(tài)等等,這些信息往往會(huì)提供給某些系統(tǒng)來(lái)對(duì)圖片進(jìn)行正確的顯示,但是我們?cè)趯?duì)處理圖片的時(shí)候通常會(huì)丟失掉那些圖片信息,這就會(huì)導(dǎo)致顯示出現(xiàn)問(wèn)題,很典型的一個(gè)顯示錯(cuò)誤就是對(duì)Iphone拍攝的照片進(jìn)行剪裁之后發(fā)現(xiàn)圖片旋轉(zhuǎn)了90度,這個(gè)時(shí)候就需要對(duì)圖片進(jìn)行相應(yīng)的處理。

背景

博主是在一個(gè)小項(xiàng)目中遇到的這個(gè)問(wèn)題,這個(gè)項(xiàng)目雖然小,但是涉及到的各種坑真的可以寫一篇比較長(zhǎng)的技術(shù)文章了,這里先不描述,后面單獨(dú)發(fā)一篇關(guān)于這個(gè)項(xiàng)目的文章,把所涉及到的知識(shí)點(diǎn)以及坑點(diǎn)一一描述。

這個(gè)小項(xiàng)目中遇到的問(wèn)題之一就是,我需要使用html5的canvas把讀取到的圖片進(jìn)行剪裁,然后渲染到畫布上。很簡(jiǎn)單的一個(gè)需求,但是在Iphone上測(cè)試經(jīng)常會(huì)看到剪裁完之后圖片自動(dòng)旋轉(zhuǎn)了90度,安卓機(jī)上不存在這個(gè)問(wèn)題。

分析

之前就遇到過(guò)這個(gè)問(wèn)題,iPhone拍攝的照片復(fù)制到win7上打開(kāi)圖片就是一個(gè)倒過(guò)來(lái)的,而在手機(jī)上看卻沒(méi)有問(wèn)題,這就是因?yàn)閑xif信息在搞鬼,簡(jiǎn)單點(diǎn)說(shuō)exif就是保留了圖片的拍攝參數(shù),顯示的時(shí)候程序會(huì)讀取圖片的exif信息,如果exif信息不存在,那么圖片就是按照最原始的形式顯示,如果有exif信息,程序就會(huì)按照exif來(lái)。

這里博主遇到的情況是圖片在進(jìn)行剪裁的時(shí)候?qū)е耬xif信息丟失,本來(lái)程序讀取exif中圖片要求順時(shí)針旋轉(zhuǎn)90°,現(xiàn)在exif丟失,程序讀不到,默認(rèn)圖片不用旋轉(zhuǎn),那么我們看到的圖片就是倒著的,這里應(yīng)該怎么解決呢?

在這個(gè)項(xiàng)目中,由于讀取的圖片存在跨域問(wèn)題,不能直接對(duì)本地的圖片進(jìn)行裁剪,所以是先上傳到遠(yuǎn)程服務(wù)器,生成一個(gè)遠(yuǎn)程的地址,然后再用canvas讀取遠(yuǎn)程地址,這樣就解決了跨域問(wèn)題。

現(xiàn)在擺在博主面前就有兩種解決方案了

  1. 只用exif.js本地讀取圖片的exif信息,直接在客戶端進(jìn)行判斷

  2. 上傳到服務(wù)器的時(shí)候?qū)D片進(jìn)行處理,返回的遠(yuǎn)程地址已經(jīng)是處理過(guò)的圖片

對(duì)這兩種方案進(jìn)行對(duì)比,第一種方案看起來(lái)確實(shí)挺適合,直接在前端進(jìn)行處理,這里會(huì)非常節(jié)省服務(wù)器資源,但是缺點(diǎn)也很明顯,canvas對(duì)圖片的渲染有一定的限制,當(dāng)圖片過(guò)大的時(shí)候渲染就會(huì)失敗,而在這個(gè)項(xiàng)目中客戶要求最后生成的圖片一定要高清大圖,上傳的照片一般都有3~5M大小,這么大的圖片大多數(shù)時(shí)候canvas都無(wú)法處理。

exif.js的原理其實(shí)比較簡(jiǎn)單,就是把圖片轉(zhuǎn)換成base64字符串,對(duì)其中的信息進(jìn)行解析,所以一旦要對(duì)大圖進(jìn)行處理的時(shí)候就會(huì)出現(xiàn)問(wèn)題,數(shù)據(jù)量太大,導(dǎo)致失敗。

第一種方案不可行就只能選擇第二種方案了,項(xiàng)目后端使用php做中轉(zhuǎn)處理,前面說(shuō)了需要生成一個(gè)遠(yuǎn)程地址,php負(fù)責(zé)把接收到的圖片存儲(chǔ)在遠(yuǎn)程服務(wù)器,然后返回一個(gè)地址給前端,這里只需要在存儲(chǔ)之前對(duì)圖片做處理就可以解決這個(gè)問(wèn)題。

解決

首先給出完整代碼,然后對(duì)代碼進(jìn)行解釋

include_once ("../weixin/jssdk.php");
$jssdk = new JSSDK("wx**************", "******************************");
$access_token = $jssdk->getAccessToken();

$media_id = $_POST['i'];
$savePathFile = '/upload/temps/'.date('YmdHis').rand(1000,9999).'.jpg';
$targetName = __DIR__.$savePathFile;

$str = "/tupian/20230522/get
$image = imagecreatefromstring(file_get_contents($str));
$exif = exif_read_data($str);

if(!empty($exif['Orientation'])) {
 switch($exif['Orientation']) {
 case 8:
  $image = imagerotate($image,90,0);
  break;
 case 3:
  $image = imagerotate($image,180,0);
  break;
 case 6:
  $image = imagerotate($image,-90,0);
  break;
 }
}

imagejpeg($image,$targetName);
echo json_encode(array("code"=>0,'d'=>$exif['Orientation'],"path"=>$savePathFile));

看起來(lái)確實(shí)比較簡(jiǎn)單,主要還是調(diào)用了一些內(nèi)部函數(shù),處理起來(lái)就方便多了。


這個(gè)項(xiàng)目使用了微信的上傳接口,所以php需要從微信的臨時(shí)服務(wù)器上把用戶上傳的圖片取回來(lái),通過(guò)file_get_contents方法就能快速拿到,當(dāng)然也可以用curl來(lái)做。接著使用imagecreatefromstring創(chuàng)建一個(gè)圖片的緩存,正常情況下如果不需要對(duì)圖片進(jìn)行處理,那么接下來(lái)就可以直接存儲(chǔ)了,這里我們還需要對(duì)圖片進(jìn)行一些操作。

通過(guò) exif_read_data 方法可以直接讀取到圖片的exif信息。

注意:exif_read_data 這個(gè)方法是exif擴(kuò)展里面的方法,如果不能執(zhí)行,請(qǐng)檢查擴(kuò)展是否安裝,是否開(kāi)啟等。

exif模塊里面還有很多有意思的方法,可以拿來(lái)做很多有用的東西,比如拿來(lái)批量采集并分析圖片,提取圖片信息等。

if(!empty($exif['Orientation'])) {
 switch($exif['Orientation']) {
 case 8:
  $image = imagerotate($image,90,0);
  break;
 case 3:
  $image = imagerotate($image,180,0);
  break;
 case 6:
  $image = imagerotate($image,-90,0);
  break;
 }
}

這一段就很容易看懂了,就是判斷圖片的旋轉(zhuǎn)狀態(tài),對(duì)圖片進(jìn)行旋轉(zhuǎn)處理imagerotate方法很好用,當(dāng)然同類的還有好多函數(shù),可以去了解下,如果你正在做圖片處理,這些函數(shù)應(yīng)該會(huì)有很大的幫助。


最后使用 imagejpeg 方法把處理過(guò)的圖片寫入到磁盤,然后返回一個(gè)包含遠(yuǎn)程地址的json到前端。

注意:我這里沒(méi)有做異常捕獲,正常情況下文件io操作都必須要做異常捕獲,這里的代碼只為了說(shuō)明使用方法,所以省略了這一步。

總結(jié)

在這個(gè)小項(xiàng)目中,最為常見(jiàn)的問(wèn)題就是在php函數(shù)的使用上,同一種效果可以使用多個(gè)函數(shù)進(jìn)行處理,選擇一個(gè)簡(jiǎn)潔高效的函數(shù)非常重要,在使用第三方擴(kuò)展的時(shí)候務(wù)必確認(rèn)擴(kuò)展是否安裝,擴(kuò)展依賴的插件是否安裝,是否已經(jīng)開(kāi)啟,是否有其他額外的附加條件等。

前端方面需要知道所使用的js插件有那些附加功能,如果api文章不夠清晰可以直接打開(kāi)插件源碼,通常情況下,一個(gè)出色的插件往往會(huì)在未壓縮的代碼里面寫明所有接口的使用方法,以及注意事項(xiàng),使用條件等。

此外,還需要對(duì)不常見(jiàn)的情況進(jìn)行判定,當(dāng)出現(xiàn)一些詭異bug的時(shí)候就應(yīng)該考慮是否是因?yàn)楫?dāng)前所給的參數(shù)不符合規(guī)范,或者超出了規(guī)范允許的范圍,上面說(shuō)道的圖片轉(zhuǎn)base64格式的大小限制就是一個(gè)很難被發(fā)現(xiàn)的問(wèn)題,博主在調(diào)試的時(shí)候?qū)ι傻臄?shù)據(jù)進(jìn)行觀察才發(fā)現(xiàn),當(dāng)出現(xiàn)大圖的時(shí)候就會(huì)轉(zhuǎn)換失敗。

感謝各位的閱讀!關(guān)于“php中如何實(shí)現(xiàn)照片旋轉(zhuǎn) ”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

網(wǎng)站欄目:php中如何實(shí)現(xiàn)照片旋轉(zhuǎn)-創(chuàng)新互聯(lián)
網(wǎng)頁(yè)網(wǎng)址:http://chinadenli.net/article48/dhshep.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化建站公司外貿(mào)建站面包屑導(dǎo)航云服務(wù)器Google

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站