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。
(指令:請產生日本動漫風格的冬烘先生圖片,背景在小屋,臉部表情要柔和。並在圖片右下角加上文字「冬烘先生」)
生成圖像和生成內容的呼叫方式類似,但取得的回應(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.0-flash-exp-image-generation"; $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…),譬如將日本動漫風,改成少女動漫、台式、中式、吉卜力風、新海誠風、辛普森家族、武俠風、巴洛克風、自訂。背景從小屋,改成高山、大海、藍天、草地、森林、自訂。表情從柔和,改成嚴肅、喜悅、滿足、淡定、自訂。