aardio 文档

aardio 范例: 造相 Z-Image - AI 图像生成

import win.ui;
import fonts.fontAwesome;
import inet.http;//导入 inet.http 则 plus 控件支持图像网址
/*DSG{{*/
var winform = win.form(text="造相 Z-Image - AI 图像生成";right=900;bottom=700;bgcolor=0xF5F5F5;border="none")
winform.add(
downloadBtn={cls="plus";text="下载图像";left=750;top=631;right=870;bottom=680;align="left";bgcolor=0x27AE60;border={radius=6};color=0xFFFFFF;db=1;disabled=1;dr=1;font=LOGFONT(h=-14;weight=600);iconStyle={align="left";font=LOGFONT(h=-14;name='FontAwesome');padding={left=17;top=1}};iconText='\uF019';notify=1;textPadding={left=37};z=9};
generateBtn={cls="plus";text="生成图像";left=750;top=565;right=870;bottom=614;align="left";bgcolor=0x3498DB;border={radius=6};color=0xFFFFFF;db=1;dr=1;font=LOGFONT(h=-15;weight=600);iconStyle={align="left";font=LOGFONT(h=-16;name='FontAwesome');padding={left=17;top=1}};iconText='\uF1FC';notify=1;textPadding={left=37};z=8};
picturebox={cls="plus";text="请在下方输入提示词生成图像";left=30;top=57;right=865;bottom=493;border={color=0xFFEEEEEE;radius=8;width=1};color=0x999999;db=1;dl=1;dr=1;dt=1;font=LOGFONT(h=-16);iconStyle={font=LOGFONT(h=-60;name='FontAwesome')};iconText='\uF03E';notify=1;repeat="scale";textPadding={top=100};z=2};
progressBar={cls="plus";left=30;top=511;right=865;bottom=521;bgcolor=0xECF0F1;border={radius=3};db=1;dl=1;dr=1;forecolor=0x3498DB;hide=1;z=5};
promptEdit={cls="edit";left=30;top=565;right=730;bottom=680;autohscroll=false;bgcolor=0xFFFFFF;db=1;dl=1;dr=1;edge=1;multiline=1;vscroll=1;z=7};
promptLabel={cls="bkplus";text="提示词 (Prompt):";left=30;top=540;right=200;bottom=560;align="left";color=0x999999;db=1;dl=1;font=LOGFONT(h=-13;weight=600);z=6};
titleBar={cls="bkplus";left=0;top=0;right=900;bottom=46;bgcolor=0x2C3E50;dl=1;dr=1;dt=1;z=1};
titleIcon={cls="bkplus";text='\uF03E';left=225;top=5;right=265;bottom=41;color=0x3498DB;dl=1;dt=1;font=LOGFONT(h=-20;name='FontAwesome');z=4};
titleText={cls="bkplus";text="造相(Z-Image)文生图";left=20;top=11;right=225;bottom=31;color=0xFFFFFF;dl=1;dt=1;font=LOGFONT(h=-16;weight=700);z=3}
)
/*}}*/

// 点击事件
winform.generateBtn.oncommand = function(){
    var prompt = winform.promptEdit.text;
    if(!#string.trim(prompt)) {
        winform.msgbox("请输入提示词","提示",0x30/*_MB_ICONWARNING*/);
        return;
    }

    // 禁用按钮动画
    winform.generateBtn.disabledText = ['\uF254','\uF251','\uF252','\uF253','\uF250']
    winform.downloadBtn.disabled = true;

    winform.progressBar.show(true); 
    winform.progressBar.progressPos = 0;

    winform.picturebox.background = null;
    winform.picturebox.iconText = '\uF03E';

    thread.invoke(
        function(winform, prompt){

            import web.rest.jsonClient;
            var http = web.rest.jsonClient();

            // 请替换为自己的 API key。
            http.setAuthToken('your_api_key');

            // 设置其他 HTTP 头
            http.setHeaders({
                "X-ModelScope-Async-Mode":"true",
                "X-ModelScope-Task-Type":"image_generation"
            });

            // HTTP API
            var ai = http.api("https://api-inference.modelscope.cn/v1");

            winform.picturebox.text = "正在提交任务...";
            var imageData, err = ai.images.generations(
                model = "Tongyi-MAI/Z-Image-Turbo";
                prompt = prompt;
                size = "1080x1440";
            );

            //获取任务 ID
            var taskId = imageData[["task_id"]];//直接下标 [[]] 遇 null 值返回 null
            if(taskId){
                winform.progressBar.progressPos = 10;

                for(i=1;60){  // 尝试 60 次
                    var progress = 10 + (i * 1.5);
                    if(progress > 95) progress = 95;
                    winform.progressBar.progressPos = progress;
                    winform.picturebox.text = "生成中... " + string.format("%.0f%%", progress);

                    thread.delay(2000);

                    var result, err2 = ai.tasks[taskId].get();
                    err = err2;

                    var status = result[["task_status"]];
                    if(status == "SUCCEED"/*不能写成 "SUCCEEDED" */){
                        var imageUrl = result.output_images[1];//output_images 是 URL 数组,不要写错!!
                        winform.picturebox.background = imageUrl;

                        // 下载图像
                        // http.receiveFile("/generated_image.png").get(imageUrl);

                        winform.progressBar.progressPos = 100; 

                        winform.picturebox.iconText = null;
                        winform.picturebox.text = null;

                        var url = result.output_images[1];
                        winform.downloadBtn.disabled = false;
                        break;
                    }
                    elseif(status == "FAILED"){
                        err = "生成失败"
                    }

                    if(err) break;
                }
            }

            if(err) {
                winform.msgboxErr(err, "错误");
                winform.picturebox.text = "生成失败";
            }

            winform.generateBtn.disabledText = null;

            thread.delay(2000);
            winform.progressBar.hide = true; 

        }, winform, prompt);
};

winform.downloadBtn.oncommand = function(){
    import fsys.dlg;
    var savePath = fsys.dlg.save("PNG 图像|*.png|所有文件|*.*","保存图像","/","generated_image.png");
    if(savePath){
        winform.picturebox.background.save(savePath);
    }
};

//设置边距(上,右,下,左)
winform.promptEdit.setPadding(5,5,5,5)

winform.promptEdit.text = `画一只猫。`;

winform.progressBar.setProgressRange(0,100);

winform.generateBtn.skin({
    background={
        default=0xFF3498DB;
        hover=0xFF2980B9;
        active=0xFF1F618D;
        disabled=0xFFBDC3C7
    };
    color={
        default=0xFFFFFFFF;
        disabled=0xFF7F8C8D
    }
});

winform.downloadBtn.skin({
    background={
        default=0xFF27AE60;
        hover=0xFF229954;
        active=0xFF1E8449;
        disabled=0xFFBDC3C7
    };
    color={
        default=0xFFFFFFFF;
        disabled=0xFF7F8C8D
    }
});

import win.ui.simpleWindow;
win.ui.simpleWindow(winform);

winform.show();
win.loopMessage();
Markdown 格式