跳到主要内容 Midjourney Imagine API 申请与使用指南 | 极客日志
Python Node.js AI
Midjourney Imagine API 申请与使用指南 档介绍了 Midjourney Imagine API 的申请流程及基本使用方法。涵盖文本生成图像、图像放大与变换、垫图改写、图像融合、局部重绘(Mask)、异步回调以及流式输出等功能。提供了 Python、Curl 和 Node.js 的代码示例,帮助开发者快速集成 AI 绘图能力。
禅心 发布于 2026/4/6 更新于 2026/4/18 5 浏览Midjourney Imagine API 申请与使用
Midjourney 是一款强大的 AI 绘图工具,支持通过文本生成精美图像。本文档介绍 Midjourney Imagine API 的申请流程及核心功能的使用。
申请流程
访问 Midjourney Imagine API 文档页面点击「Acquire」按钮获取请求凭证。首次申请通常赠送免费额度。
基本使用
在界面填写 authorization 和 prompt(建议英文描述)。右侧提供调用代码生成及测试按钮。
主要请求参数:
prompt:图片描述词(支持自动翻译)。
mode:生成模式,可选 fast/relax/turbo,默认 fast。
timeout:超时时间(秒)。
translation:是否自动翻译非英文 prompt。
split_images:是否将 2x2 结果拆分返回单张。
action/image_id:对历史图片继续操作时需指定。
callback_url:异步回调地址。
返回结果示例:
{
"image_url" : "https://midjourney.cdn.acedata.cloud/..." ,
"image_width" : 1024 ,
"image_height" : 1024 ,
"image_id" : "1234197197067915365" ,
"raw_image_url" : "https://midjourney.cdn.acedata.cloud/..." ,
"raw_image_width" : 2048 ,
"raw_image_height" : 2048 ,
"progress" : 100
微信扫一扫,关注极客日志 微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
相关免费在线工具 RSA密钥对生成器 生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
Mermaid 预览与可视化编辑 基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
curl 转代码 解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
Base64 字符串编码/解码 将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
Base64 文件转换器 将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
Markdown转HTML 将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
,
"actions"
:
[
"upscale1"
,
"upscale2"
,
"upscale3"
,
"upscale4"
,
"reroll"
,
"variation1"
,
"variation2"
,
"variation3"
,
"variation4"
]
,
"task_id"
:
"1bae3bec-3ac4-4180-a148-74ee6cb68b98"
,
"success"
:
true
}
task_id:任务 ID。
image_id:图片唯一标识,用于后续变换操作。
image_url:缩略图 URL。
raw_image_url:原图 URL(更高清)。
actions:可执行的操作列表(如放大、变换)。
图像放大与变换 针对生成的图片进行进一步操作。例如将 action 设为 variation2 并传入 image_id 可生成变体;设为 upscale4 可放大第四张图片。
upscale_2x / upscale_4x:放大 2 倍或 4 倍。
zoom_out_2x / zoom_out_1_5x:缩小画面。
pan_left / pan_right / pan_up / pan_down:画面偏移。
图像改写(垫图) 支持输入图片 URL 及描述文字进行改写。Prompt 开头添加 HTTPS 图片链接,后跟空格及文字描述。可使用 --iw 调整图片权重。
图像融合 支持传入多张图片 URL 实现融合效果。最多支持 5 张图片。格式为多个 URL 空格分隔后接文字 Prompt。
https://i-blog.ZEEKLOGimg.cn/img_convert/c97448ef51e6b36bd026d72092abe548.png https://i-blog.ZEEKLOGimg.cn/img_convert/1d81aa82612a1f16e8f3ad41354af74f.png The bear is holding the chainsaw --iw2
局部变换 支持局部重绘(Inpainting)。需传入生成图片的 image_id、掩码 mask(Base64 编码)及 action(variation_region)。
import sys
import os
from PySide6.QtWidgets import *
from PySide6.QtGui import QPainter, QMouseEvent, QPen, QColor, QImage
from PySide6.QtCore import Qt, QPoint
class DrawingWidget (QWidget ):
def __init__ (self, imagePath ):
super ().__init__()
self .setAttribute(Qt.WA_StaticContents)
self .background_image = QImage(imagePath)
imageSize = self .background_image.size() * 0.8
self .setFixedSize(imageSize)
self .foreground_image = QImage(self .size(), QImage.Format_ARGB32)
self .foreground_image.fill(Qt.transparent)
self .drawing = False
self .lastPoint = QPoint()
self .pen_color = QColor(255 , 255 , 255 , 255 )
self .pen_size = 50
def set_pen_size (self, size ):
self .pen_size = size
def mousePressEvent (self, event: QMouseEvent ):
if event.button() == Qt.LeftButton:
self .drawing = True
self .lastPoint = event.pos()
def mouseMoveEvent (self, event: QMouseEvent ):
if event.buttons() & Qt.LeftButton and self .drawing:
painter = QPainter(self .foreground_image)
painter.setRenderHint(QPainter.Antialiasing, True )
pen = QPen(self .pen_color, self .pen_size, Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin)
painter.setPen(pen)
painter.drawLine(self .lastPoint, event.pos())
self .lastPoint = event.pos()
self .update()
def mouseReleaseEvent (self, event: QMouseEvent ):
if event.button() == Qt.LeftButton and self .drawing:
self .drawing = False
def paintEvent (self, event ):
canvasPainter = QPainter(self )
canvasPainter.drawImage(self .rect(), self .background_image, self .background_image.rect())
canvasPainter.drawImage(self .rect(), self .foreground_image, self .foreground_image.rect())
def save_image (self, path ):
self .foreground_image.save(path)
class MainWindow (QDialog ):
def __init__ (self, imagePath ):
super ().__init__()
self .setWindowTitle("mask tool" )
self .drawing_widget = DrawingWidget(imagePath)
self .currentPath = os.getcwd().replace("\\" , "/" )
self .tempPath = self .currentPath + "/temp.jpg"
self .projectPath = ""
self .setDone = False
def init_ui (self ):
layout = QVBoxLayout()
layout.addWidget(self .drawing_widget)
controls_layout = QHBoxLayout()
size_label = QLabel("pen size:" )
controls_layout.addWidget(size_label)
self .size_slider = QSlider(Qt.Horizontal)
self .size_slider.setMinimum(100 )
self .size_slider.setMaximum(400 )
self .size_slider.setValue(400 )
self .size_slider.valueChanged.connect(self .update_pen_size)
controls_layout.addWidget(self .size_slider)
self .lineEdit_addPromp = QLineEdit()
layout.addWidget(self .lineEdit_addPromp)
save_button = QPushButton("Start partial redrawing" )
save_button.clicked.connect(self .save_image)
controls_layout.addWidget(save_button)
dont_button = QPushButton("Cancel partial redraw" )
dont_button.clicked.connect(self .dont_image)
controls_layout.addWidget(dont_button)
layout.addLayout(controls_layout)
self .setLayout(layout)
def update_pen_size (self ):
size = self .size_slider.value()
self .drawing_widget.set_pen_size(size)
def save_image (self ):
tempImage = self .currentPath + "/temp.jpg"
self .drawing_widget.save_image(self .tempPath)
self .prompt = self .lineEdit_addPromp.text()
self .setDone = True
self .close()
def dont_image (self ):
self .setDone = False
self .close()
def closeEvent (self, event ):
if self .setDone:
pass
else :
self .setDone = False
event.accept()
if __name__ == '__main__' :
imagePath = "test.png"
app = QApplication(sys.argv)
mainWindow = MainWindow(imagePath)
mainWindow.init_ui()
mainWindow.exec ()
import cv2
import base64
image_path = 'temp.jpg'
gray_image = cv2.imread(image_path)
_, buffer = cv2.imencode('.jpg' , gray_image)
base64_encoded = base64.b64encode(buffer).decode('utf-8' )
with open ('grayscale_image_base64.txt' , 'w' ) as f:
f.write(base64_encoded)
print ("success!" )
action:variation_region
prompt:局部重绘描述词(可选)
image_id:图片唯一标识
mask:掩码区域 Base64 编码
CURL curl -X POST 'https://api.acedata.cloud/midjourney/imagine' \
-H 'accept: application/json' \
-H 'authorization: Bearer {token}' \
-H 'content-type: application/json' \
-d '{ "prompt": "A cute cat ", "action": "variation_region", "image_id": "1265875488702726144", "mask": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAIBAQEBAQIBAQECAgICAgQDAgICAgUEBAMEBgUGBgYFBgYGBwkIBgcJBwYGCAsICQoKCgoKBggLDAsKDAkKCgr/2wBDAQICAgICAgUDAwUKBwYHCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgr/wAARCAGaAZoDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD+f+iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiv12/4Jcf8GoX7XX7X+nab8af2y9Tvfgt4GmvZYZPDOpaHIni7VIYbmGOTFncxxx6dHLH9pEdzceZKJIY5PsssUschAPyJor+tT4X/wABr... }'
Python import requests
url = "https://api.acedata.cloud/midjourney/imagine"
headers = {
"accept" : "application/json" ,
"authorization" : "Bearer {token}" ,
"content-type" : "application/json"
}
payload = {
"prompt" : "A cute cat " ,
"action" : "variation_region" ,
"image_id" : "1265875488702726144" ,
"mask" : "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAIBAQEBAQIBAQECAgICAgQDAgICAgUEBAMEBgUGBgYFBgYGBwkIBgcJBwYGCAsICQoKCgoKBggLDAsKDAkKCgr/2wBDAQICAgICAgUDAwUKBwYHCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgr/wAARCAGaAZoDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD+f+iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiv12/4Jcf8GoX7XX7X+nab8af2y9Tvfgt4GmvZYZPDOpaHIni7VIYbmGOTFncxxx6dHLH9pEdzceZKJIY5PsssUschAPyJor+tT4X/wABr..."
}
response = requests.post(url, json=payload, headers=headers)
print (response.text)
异步回调 API 支持 Webhook 回调。设置 callback_url 为接收 HTTP 请求的服务地址。生成成功或失败时,结果将通过 HTTP 请求发送。
{ "success" : true , "task_id" : "f6e39eaf-652a-4bf5-a15c-79d8b143b80a" , "image_url" : "..." , "image_id" : "..." , "task_id" : "..." }
{ "success" : false , "task_id" : "7ba0feaf-d20b-4c22-a35a-31ec30fc7715" , "error" : { "code" : "bad_request" , "message" : "Unrecognized argument(s): `-c`, `x`" } }
流式输出 支持流式输出以改善用户体验。修改请求头 accept 为 application/x-ndjson。
import requests
url = 'https://api.acedata.cloud/midjourney/imagine'
headers = {'content-type' :'application/json' ,'accept' :'application/x-ndjson' ,'authorization' :'Bearer {token}' }
body = {"prompt" :"a beautiful cat --v 6" }
r = requests.post(url, headers=headers, json=body, stream=True )
for line in r.iter_lines():
print (line.decode())
const axios = require ("axios" );
const url = "https://api.acedata.cloud/midjourney/imagine" ;
const headers = {
"content-type" : "application/json" ,
accept : "application/x-ndjson" ,
authorization : "Bearer {token}" ,
};
const body = {
prompt : "a beautiful cat --v 6" ,
action : "generate" ,
};
axios.post (url, body, { headers : headers, responseType : "stream" })
.then ((response ) => {
console .log (response.status );
response.data .on ("data" , (chunk ) => {
console .log (chunk.toString ());
});
})
.catch ((error ) => {
console .error (error);
});
注意:流式输出中 progress 字段表示生成进度(0-100)。未完全完成时 actions 为空。生成完成后中间图像 URL 将被销毁。可通过指定 accept=application/x-ndjson 和 callback_url 结合流式结果与异步回调。