This Post is under 軟體開發
跟AI聊天對話已經不是稀奇的事情,最近興起了一股讓AI以吉卜力風格生成圖像的熱潮。雖然大多數人都是用ChatGPT來做,不過Google Gemini也可以生成圖片,本文參考Gemini 圖像生成的說明文件,並以去年的使用 PHP 呼叫 Google Gemini API 生成內容為基礎,來實作Gemini圖像生成(如上圖就是Gemini動態生成,每次進到本網頁,看到的圖片都不同。)
根據文件說明,目前Gemini API 支援使用 Gemini 2.0 Flash Experimental 和 Imagen 3 產生圖片。但Imagen3必須付費才能使用,因此本文使用Gemini 2.0 Flash Experimental gemini-2.5-flash-image。
(指令:請產生日本動漫風格的冬烘先生圖片,背景在小屋,臉部表情要柔和。並在圖片右下角加上文字「冬烘先生」)
生成圖像和生成內容的呼叫方式類似,但取得的回應(response)的處理方式稍稍有點不同,最主要差異是在php中如何將圖像直接輸出。在「生成圖像」的response,圖像的data放在 $part[“inlineData”][“data”] ,且預先以base64編碼,所以若要從 php 直接輸出圖像,必須先抓到$part[“inlineData”],再以base64解碼資料,以對應的 mimeType輸出。
以下就是在網站伺服器端呼叫 Google Gemini 生成圖像的程式碼,以 php curl 來實作。
<?php
$model = isset($_REQUEST['m']) ? $_REQUEST['m'] : "gemini-2.5-flash-image";
$geminiQuery = isset($_REQUEST['q']) ? $_REQUEST['q'] : "請產生日本動漫風格的冬烘先生圖片,背景在小屋,臉部表情要柔和。並在圖片右下角加上文字「冬烘先生」";
$api_key = "YOUR_GEMINI_KEY";
$url = "https://generativelanguage.googleapis.com/v1beta/models/{$model}:generateContent?key={$api_key}";
$data = array(
"contents" => array(
array(
"parts" => array(
array(
"text" => $geminiQuery
)
)
)
)
);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$response = curl_exec($ch);
curl_close($ch);
if (curl_errno($ch)) {
die("{ 'error': '" . curl_error($ch) . "'}");
}
$imageData = json_decode($response, true);
foreach ($imageData["candidates"][0]["content"]["parts"] as $part) {
if(isset($part["inlineData"])) {
header("Content-type: {$part["inlineData"]["mimeType"]}");
print(base64_decode($part["inlineData"]["data"]));
exit;
}
}
看到這裡,你可能會手癢,想要自己改變圖像生成的風格(或背景,表情,whatever…),譬如將日本動漫風,改成少女動漫、台式、中式、吉卜力風、新海誠風、辛普森家族、武俠風、巴洛克風、自訂。背景從小屋,改成高山、大海、藍天、草地、森林、自訂。表情從柔和,改成嚴肅、喜悅、滿足、淡定、自訂。


