生成图像缩略图(支持:JPEG,GIT,PNG,BMP)
<?php class Thumb { public function create($srcPath, $dstPath, $dstWidth, $dstHeight) { if (!file_exists($srcPath)) { return false; } @$srcSize = getimagesize($srcPath); if (empty($srcSize)) { return false; } $srcWith = intval($srcSize[0]); $srcHeight = intval($srcSize[1]); //如果原始图片的尺寸大于指定缩略图的尺寸,则生成缩略图,否则拷贝原始文件 if ($srcWith <= $dstWidth && $srcHeight <= $dstHeight) { return copy($srcPath, $dstPath); } //读取原始图片资源 @$srcImage = imagecreatefromjpeg($srcPath); if (empty($srcImage)) { @$srcImage = imagecreatefromgif($srcPath); } if (empty($srcImage)) { @$srcImage = imagecreatefrompng($srcPath); } if (empty($srcImage)) { @$srcImage = $this->_imageCreateFromBMP($srcPath); } if (empty($srcImage)) { return false; } //获取缩略图的尺寸,并据此生成新的图像 $dstSize = $this->_getDstSize( $srcWith, $srcHeight, $dstWidth, $dstHeight ); @$dstImage = imagecreatetruecolor( $dstSize['width'], $dstSize['height'] ); @imagecopyresampled( $dstImage, $srcImage , 0, 0, 0, 0, $dstSize['width'], $dstSize['height'], $srcWith, $srcHeight ); return @imagepng($srcPath, $dstPath); } private function _imageCreateFromBMP($filePath) { $fileHandle = fopen($filePath, 'rb'); if (empty($fileHandle)) { return false; } $file = unpack( 'vfile_type/Vfile_size/Vreserved/Vbitmap_offset', fread($fileHandle, 14) ); if ($file['file_type'] != 19778) { return false; } $bmp = unpack( 'Vheader_size/Vwidth/Vheight/vplanes/'. 'vbits_per_pixel/Vcompression/Vsize_bitmap/'. 'Vhoriz_resolution/Vvert_resolution/Vcolors_used/Vcolors_important', fread($fileHandle, 40) ); $bmp['colors'] = pow(2, $bmp['bits_per_pixel']); if ($bmp['size_bitmap'] == 0) { $bmp['size_bitmap'] = $file['file_size'] - $file['bitmap_offset']; } $bmp['bytes_per_pixel'] = $bmp['bits_per_pixel'] / 8; $bmp['bytes_per_pixel2'] = ceil($bmp['bytes_per_pixel']); $bmp['decal'] = $bmp['width'] * $bmp['bytes_per_pixel'] / 4; $bmp['decal'] -= floor($bmp['width'] * $bmp['bytes_per_pixel'] / 4); $bmp['decal'] = 4 - (4 * $bmp['decal']); if ($bmp['decal'] == 4) { $bmp['decal'] = 0; } $palette = array(); if ($bmp['colors'] < 16777216) { $palette = unpack( 'V' . $bmp['colors'], fread($fileHandle, $bmp['colors'] * 4) ); } $image = fread($fileHandle, $bmp['size_bitmap']); $vide = chr(0); $res = imagecreatetruecolor($bmp['width'], $bmp['height']); $p = 0; $y = $bmp['height'] - 1; while ($y >= 0) { $x = 0; while ($x < $bmp['width']) { if ($bmp['bits_per_pixel'] == 24) { $color = unpack('V', substr($image, $p, 3) . $vide); } else if ($bmp['bits_per_pixel'] == 16) { $color = unpack('n', substr($image, $p, 2)); $color[1] = $palette[$color[1]+1]; } else if ($bmp['bits_per_pixel'] == 8) { $color = unpack('n', $vide . substr ($image, $p, 1)); $color[1] = $palette[$color[1]+1]; } else if ($bmp['bits_per_pixel'] ==4) { $color = unpack('n', $vide . substr($image, floor($p), 1)); if (($p * 2) % 2 == 0) { $color[1] = ($color[1] >> 4); } else { $color[1] = ($color[1] & 0x0F); } $color[1] = $palette[$color[1] + 1]; } else if ($bmp['bits_per_pixel'] == 1) { $color = unpack('n', $vide . substr($image, floor($p), 1)); switch (($p * 8) % 8) { case 0: $color[1] = ($color[1] >> 7); break; case 1: $color[1] = ($color[1] & 0x40) >> 6; break; case 2: $color[1] = ($color[1] & 0x20) >> 5; break; case 3: $color[1] = ($color[1] & 0x10) >> 4; break; case 4: $color[1] = ($color[1] & 0x8) >> 3; break; case 5: $color[1] = ($color[1] & 0x4) >> 2; break; case 6: $color[1] = ($color[1] & 0x2) >> 1; break; case 7: $color[1] = ($color[1] & 0x1); break; } $color[1] = $palette[$color[1] + 1]; } else { return false; } imagesetpixel($res, $x, $y, $color[1]); $x++; $p += $bmp['bytes_per_pixel']; } $y--; $p += $bmp['decal']; } fclose($fileHandle); return $res; } private function _getDstSize($srcWith, $srcHeight, $dstWidth, $dstHeight) { $size = array('width' => $srcWith, 'height' => $srcHeight); if ($dstWidth > 0 && $dstHeight > 0) { if ($srcWith > 0 && $srcHeight > 0) { if ($srcWith / $srcHeight >= $dstWidth / $dstHeight) { if ($srcWith > $dstWidth) { $size['width'] = $dstWidth; $size['height'] = $srcHeight * $dstWidth / $srcWith; } } else { if ($srcHeight > $dstHeight) { $size['width'] = $srcWith * $dstHeight / $srcHeight; $size['height'] = $dstHeight; } } } } return $size; } }

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

要通過 Git 下載項目到本地,請按以下步驟操作:安裝 Git。導航到項目目錄。使用以下命令克隆遠程存儲庫:git clone https://github.com/username/repository-name.git

更新 git 代碼的步驟:檢出代碼:git clone https://github.com/username/repo.git獲取最新更改:git fetch合併更改:git merge origin/master推送更改(可選):git push origin master

解決 Git 下載速度慢時可採取以下步驟:檢查網絡連接,嘗試切換連接方式。優化 Git 配置:增加 POST 緩衝區大小(git config --global http.postBuffer 524288000)、降低低速限制(git config --global http.lowSpeedLimit 1000)。使用 Git 代理(如 git-proxy 或 git-lfs-proxy)。嘗試使用不同的 Git 客戶端(如 Sourcetree 或 Github Desktop)。檢查防火

Git Commit 是一種命令,將文件變更記錄到 Git 存儲庫中,以保存項目當前狀態的快照。使用方法如下:添加變更到暫存區域編寫簡潔且信息豐富的提交消息保存並退出提交消息以完成提交可選:為提交添加簽名使用 git log 查看提交內容

Git 代碼合併過程:拉取最新更改以避免衝突。切換到要合併的分支。發起合併,指定要合併的分支。解決合併衝突(如有)。暫存和提交合併,提供提交消息。

在開發一個電商網站時,我遇到了一個棘手的問題:如何在大量商品數據中實現高效的搜索功能?傳統的數據庫搜索效率低下,用戶體驗不佳。經過一番研究,我發現了Typesense這個搜索引擎,並通過其官方PHP客戶端typesense/typesense-php解決了這個問題,大大提升了搜索性能。

要刪除 Git 倉庫,請執行以下步驟:確認要刪除的倉庫。本地刪除倉庫:使用 rm -rf 命令刪除其文件夾。遠程刪除倉庫:導航到倉庫設置,找到“刪除倉庫”選項,確認操作。

如何更新本地 Git 代碼?用 git fetch 從遠程倉庫拉取最新更改。用 git merge origin/<遠程分支名稱> 將遠程變更合併到本地分支。解決因合併產生的衝突。用 git commit -m "Merge branch <遠程分支名稱>" 提交合併更改,應用更新。
