PHP 日本研討會 2024

影像處理與 GD

新增筆記

使用者貢獻的筆記 5 則筆記

mail at ecross dot nl
14 年前
您好,
我建立了一個用於建立漸層影像的函式。

說明
gradient(int image_width, int image_height,
int start_red, int start_green, int start_blue,
int end_red, int end_green, int end_blue,
bool vertical)

函式
<?php
function gradient($image_width, $image_height,$c1_r, $c1_g, $c1_b, $c2_r, $c2_g, $c2_b, $vertical=false)
{
// 首先:讓我們進行型別轉換;
$image_width = (integer)$image_width;
$image_height = (integer)$image_height;
$c1_r = (integer)$c1_r;
$c1_g = (integer)$c1_g;
$c1_b = (integer)$c1_b;
$c2_r = (integer)$c2_r;
$c2_g = (integer)$c2_g;
$c2_b = (integer)$c2_b;
$vertical = (bool)$vertical;

// 建立影像
$image = imagecreatetruecolor($image_width, $image_height);

// 建立漸層
for($i=0; $i<$image_height; $i++)
{
$color_r = floor($i * ($c2_r-$c1_r) / $image_height)+$c1_r;
$color_g = floor($i * ($c2_g-$c1_g) / $image_height)+$c1_g;
$color_b = floor($i * ($c2_b-$c1_b) / $image_height)+$c1_b;

$color = ImageColorAllocate($image, $color_r, $color_g, $color_b);
imageline($image, 0, $i, $image_width, $i, $color);
}

# 列印所有圖形和圖片,並釋放記憶體
header('Content-type: image/png');

if(
$vertical){$image = imagerotate($image, 90, 0);}
ImagePNG($image);
imagedestroy($image);
}
?>
kurdtpage at gmail dot com
13 年前
當使用 GD 時,請確保以下事項

1. 用於操作影像的檔案儲存為 ANSI 格式,而不是 UTF-8
2. 在開頭標籤 <?php 前面沒有空格
Thomas
15 年前
您知道,也許這是理所當然的,但我想在這裡做個筆記。在開發用於調整影像大小的程式碼時,最好不要使用 GD。當使用目前的 GD 方法時,您正在讀取影像的內容並操作它。然後將該內容寫入全新的檔案,您會遺失 EXIF 資料。

對於想要保留 EXIF 資料的情況,建議您編譯並使用 PECL Imagick 擴充功能。它內建了很棒的大小調整方法,並且會保留 EXIF 資料。
herbert dot walde at googlemail dot com
12 年前
如果您的腳本在某處使用輸出緩衝函式,那麼您必須先清除緩衝區(使用 ob_clean()),然後再使用像 imagepng() 這樣的函式輸出影像。

您應該確保在輸出影像後,不會有任何緩衝區被傳送,方法是使用 ob_end_flush() 函式。

此外,您應該檢查是否已在其他地方刷新緩衝區。這可以使用 headers_sent() 函式完成。

這是完整的解決方案

<?php
if(headers_sent()){
die(
'標頭已在我的腳本中的某處傳送');
}

ob_clean(); // 清除緩衝區

header('Content-type: image/png');
imagepng($img, NULL, 0, NULL);

ob_end_flush(); // 現在我們傳送標頭和影像,此外我們還確保從現在起不會傳送任何內容(包括可能的關機函式和 __destruct() 方法),直到頁面執行結束
?>
code at ashleyhunt dot co dot uk
16 年前
我一直在尋找將 GD 的輸出傳送到文字字串的方法,而無需透過檔案或瀏覽器進行代理。

我已經找到了一個解決方案。

此程式碼將 ob_start() 和 ob_end() 函式之間的輸出緩衝到 ob_get_contents() 中

請參閱以下範例

<?php
// 為此範例建立一個測試用的來源影像
$im = imagecreatetruecolor(300, 50);
$text_color = imagecolorallocate($im, 233, 14, 91);
imagestring($im, 1, 5, 5, '一個簡單的文字字串', $text_color);

// 開始緩衝
ob_start();
// 輸出 jpeg (或任何其他選擇的) 格式 & 品質
imagejpeg($im, NULL, 85);
// 將輸出捕獲到字串
$contents = ob_get_contents();
// 結束捕獲
ob_end_clean();

// 清理;釋放記憶體
imagedestroy($im);

// 最後 (為了範例) 我們將字串寫入檔案
$fh = fopen("./temp/img.jpg", "a+" );
fwrite( $fh, $contents );
fclose( $fh );
?>

請享用!
Ashley
To Top