Google官方Nano Banana保姆级开发教程:从API密钥获取到Python实战,图像生成与编辑代码详解

算泥社区是集“AI大模型开发服务 + 算法 + 算力”于一体的开源生态社区,欢迎关注!

 

最近在AI图像圈子里被大家玩疯了的Nano Banana新模型,终于迎来了官方保姆级开发教程。从环境准备到代码实战,再到如何与它“对话”生成你想要的神图,所有你想知道的,全都给你讲透了。




万事开头难?这次真的很简单。在正式写代码之前,咱们得先找个地方体验一下这个新玩具,找找感觉。谷歌为大家准备了一个绝佳的“游乐场”——Google AI Studio。在这里,你可以免费、无限制地和Nano Banana互动,测试各种天马行空的想法,甚至不需要写一行代码。

在正式开工前,先在这里把你的提示词打磨到炉火纯青。进入这个专属游乐场非常简单,直接访问 aistudio.google.com,用你的谷歌账户登录,然后在模型选择器里找到Nano Banana就可以了。




热身结束,进入下一关。我们需要准备好“装备”:首先,你需要一把“钥匙”——来自Google AI Studio的API key。其次,你需要为项目“充值”——设置好结算账户。最后,你需要一套“工具”——谷歌的Gen AI SDK,无论你是Python党还是JavaScript/TypeScript高手,都有对应的版本。

python:https://github.com/googleapis/python-genai

JavaScript:https://github.com/googleapis/js-genai

拿到API key的过程非常直接。在Google AI Studio的左侧导航栏找到“Get API key”,点击“Create API key”,然后选择一个现有的Google Cloud项目或者新建一个。这个项目主要是用来管理你调用API产生的费用。完成后,你就会得到一串密钥,记得妥善保管,这可是你的重要凭证。

接下来是大家最关心的费用问题。虽然在AI Studio里调试是免费的,但通过API调用模型来构建真正的应用是需要付费的。你需要在API密钥管理页面,找到你的项目并点击“Set up billing”来启用结算功能。




那么,用Nano Banana到底贵不贵?其实相当亲民。生成一张图片的成本大约是0.039美元,换算下来1美元大概能生成25张图片。官方的定价是输入token每百万0.30美元,输出token每百万30美元。一张标准的1024×1024像素图片会消耗1290个输出token,算下来就是前面说的那个价。

最后一步,安装SDK。根据你的技术栈选择对应的命令:

如果你用Python:

pip install -U google-genai # 别忘了装Pillow库,处理图片会用到 pip install Pillow

如果你用JavaScript / TypeScript:

npm install @google/genai

接下来的例子我主要用Python来演示,但如果你是前端高手,可以去GitHub链接找到对应的JavaScript代码片段。

让代码施展真正的图像魔法

准备工作就绪,好戏正式开场。先从最基础的“无中生有”开始——用一段文字描述来生成图片。记住,调用API时指定的模型ID是 gemini-2.5-flash-image-preview。

from google import genai from PIL import Image from io import BytesIO # 用你的API密钥配置好客户端 client = genai.Client(api_key="YOUR_API_KEY") prompt = """Create a photorealistic image of an orange cat with a green eyes, sitting on a couch.""" # 调用API生成内容 response = client.models.generate_content( model="gemini-2.5-flash-image-preview", contents=prompt, ) # 模型的返回结果可能同时包含文本和图片数据,需要遍历找到图片并保存 for part in response.candidates[0].content.parts: if part.text is not None: print(part.text) elif part.inline_data is not None: image = Image.open(BytesIO(part.inline_data.data)) image.save("cat.png")

执行完这段代码,你会得到一张图片。




你会发现,返回的response结构很有特点——它是一个包含多个部分的列表。这是因为这个模型是多模态的,可以在一次响应里同时返回文字和图片,所以我们需要写个循环来把它们分开。

生成新图只是开胃菜,Nano Banana真正强大的地方在于图像编辑。它能理解一张现有的图片,并根据你的指令进行修改,而且最厉害的是能很好地保持原图中的角色和内容一致性。

用刚才生成的猫图来试试:

from google import genai from PIL import Image from io import BytesIO client = genai.Client(api_key="YOUR_API_KEY") prompt = """Using the image of the cat, create a photorealistic, street-level view of the cat walking along a sidewalk in a New York City neighborhood, with the blurred legs of pedestrians and yellow cabs passing by in the background.""" image = Image.open("cat.png") # 注意,这次我们把文本和图片一起放进 'contents' 列表里 response = client.models.generate_content( model="gemini-2.5-flash-image-preview", contents=[prompt, image], ) for part in response.candidates[0].content.parts: if part.text is not None: print(part.text) elif part.inline_data is not None: image = Image.open(BytesIO(part.inline_data.data)) image.save("cat2.png")

看看效果,是不是很惊艳?




这种能力的应用场景非常广,比如照片修复。家里那些承载着回忆的黑白老照片现在有救了,一个简单的指令就能让它焕发新生。

from google import genai from PIL import Image from io import BytesIO client = genai.Client(api_key="YOUR_API_KEY") prompt = "Restore and colorize this image from 1932" image = Image.open("lunch.jpg") response = client.models.generate_content( model="gemini-2.5-flash-image-preview", contents=[prompt, image], ) for part in response.candidates[0].content.parts: if part.text is not None: print(part.text) elif part.inline_data is not None: image = Image.open(BytesIO(part.inline_data.data)) image.save("lunch-restored.png")

看看修复前后的对比——著名的照片《摩天楼顶上的午餐,1932》:




Nano Banana还能处理更复杂的任务,比如同时理解多张图片。想象一下,你想给照片里的人物换件衣服,只需要提供人物照片和衣服的照片,然后告诉它你想做什么。

from google import genai from PIL import Image from io import BytesIO client = genai.Client(api_key="YOUR_API_KEY") prompt = "Make the girl wear this t-shirt. Leave the background unchanged." image1 = Image.open("girl.png") image2 = Image.open("tshirt.png") response = client.models.generate_content( model="gemini-2.5-flash-image-preview", contents=[prompt, image1, image2], ) for part in response.candidates[0].content.parts: if part.text is not None: print(part.text) elif part.inline_data is not None: image = Image.open(BytesIO(part.inline_data.data)) image.save("girl-with-tshirt.png")

结果就像这样:




像聊天一样去修改你的图片

有时候,我们很难一次性把需求描述完美。如果能像和设计师沟通一样,反复修改就好了。Nano Banana的聊天会话功能就能满足你——开启一个会话,在上下文中不断对图片进行迭代优化。

from google import genai from PIL import Image from io import BytesIO client = genai.Client(api_key="YOUR_API_KEY") # 创建一个聊天会话 chat = client.chats.create( model="gemini-2.5-flash-image-preview" ) # 第一次编辑 response1 = chat.send_message( [ "Change the cat to a bengal cat, leave everything else the same", Image.open("cat.png"), ] ) # 这里可以展示或保存图片... # 继续聊天,进行第二次编辑 response2 = chat.send_message("The cat should wear a funny party hat") # 再次展示或保存图片...

经过两轮对话,图片就变成了这样:




这里有个小提示:如果在连续多轮的对话编辑后,发现图片的一些细节开始变得模糊或者“跑偏”,最好的办法是停下来,用最新生成的图片开启一个新的会话,然后给出一个更全面、更具体的综合性指令。这样可以保持图片的高保真度。

学会和AI沟通的艺术

要想让Nano Banana发挥出百分之百的功力,你需要掌握一些和它沟通的技巧。这就像是学习一门新的语言——你越懂它,它就越懂你。

首先,要描述得极其具体。不要只说“一只猫”,要说“一只橘色的、绿眼睛的、坐在沙发上的猫”。主体、颜色、光线、构图,细节越多,你对结果的控制力就越强。

其次,告诉它你的意图。你希望这张图是温馨的、是紧张的、还是充满未来感的?理解了你的创作背景和情绪,模型会做出更有创造性的选择。

再者,要有耐心,不断迭代。别指望一次就能得到完美的结果。利用它的对话能力,一步步微调,直到你满意为止。

对于复杂的场景,可以试试分步指令。像写菜谱一样,清晰地告诉它第一步做什么,第二步做什么。

还有一个技巧是多用正面描述。与其说“不要有车”,不如说“一条空旷、寂静、没有任何交通迹象的街道”。

最后,学会使用专业术语来控制“镜头”。比如“广角镜头”、“微距拍摄”、“低角度视角”等等,这些词汇能帮助模型更好地理解你想要的画面构图。

想深入学习,可以去看看官方博客里关于提示词最佳实践的文章,以及文档里的提示词指南。

最佳实践:https://developers.googleblog.com/en/how-to-prompt-gemini-2-5-flash-image-generation-for-the-best-results/

提示词指南:https://ai.google.dev/gemini-api/docs/image-generation?hl=zh-cn#prompt-guide

教程最后还附上了社区里很多大神用它做出的非常酷的东西:




视角切换:@henrydaubrez




少量图片实现角色一致性设计:@multimodalart




从谷歌地图中给你实景(“红色箭头所指的是什么?”):@tokumin




角色+草图生成画面:@yachimat_manga




静态图片生成3D模型:@deedydas




由于Nano Banana拥有Gemini的世界知识,可以用来标注真实世界中的景物:@bilawalsidhu




2D地图平面转3D:@demishassabis

去创造吧,用代码和想象力,看看这个工具能在你手中绽放出怎样的火花。

END