A27:图像九宫格分割程序

一、目录创建

  • fsys.createDir

二、打开文件对话框

  • fsys.dlg.open

三、drawImageRectRect函数

  • drawImageRectRect(图像, 目标左, 目标上, 目标宽, 目标高, 源左, 源上, 源宽, 源高)

  • drawImageRectRect 是 aardio 中用于在 gdip 库(Graphics Device Interface Plus)绘制图像的一个函数。

    它的核心功能是将源图像中的指定矩形区域,绘制(并可选择缩放)到目标设备上下文(DC)的指定矩形区域中。

  • 该函数的强大之处在于它允许你精确地控制要绘制图像的哪一部分(源矩形),以及将它绘制在目标位置的哪个区域、以多大尺寸显示(目标矩形)。

    如果源矩形和目标矩形的尺寸不一致,图像会自动进行缩放以适应目标矩形。

四、注意事项

  • 释放资源:
    在循环内创建的 tile 和 graphics 对象一定要调用 .delete()。如果不释放,大批量处理图片时会占用大量内存。
  • 坐标系:
    GDI+ 的 drawImageRectRect 非常强大,它会自动处理缩放。在你的场景中,源矩形和目标矩形宽高一致,所以是 1:1 裁剪。

五、程序

复制代码
// 图像九宫格分割程序
import win.ui;
/*DSG{{*/
var winform = win.form(text="图像九宫格分割工具";right=757;bottom=467)
winform.add(
button={cls="button";text="选择并分割图像";left=522;top=394;right=714;bottom=445;z=2};
plus={cls="plus";left=32;top=24;right=725;bottom=368;db=1;dl=1;dr=1;dt=1;repeat="scale";z=1}
)
/*}}*/

import gdip.bitmap;
import fsys.dlg;
import process;
import fsys;

winform.button.oncommand = function(id,event){
    var path = fsys.dlg.open("图像文件|*.jpg;*.png;*.bmp;*.gif|","请选择要分割的图像");
    if(!path) return;
    
    winform.plus.background = path;
    
    // 加载原始图像
    var bmp = gdip.bitmap(path);
    var w, h = bmp.width, bmp.height;
    
    // 计算每一格的尺寸(向下取整)
    var cw, ch = math.floor(w / 3), math.floor(h / 3);
    if(cw <= 0 || ch <= 0) return winform.msgboxErr("图像太小,无法分割");
    
    // 创建输出目录
    var outDir = io.fullpath("/分割结果_" + tostring(time.tick()));
    fsys.createDir(outDir); 
    
    for(row=0;2;1){
        for(col=0;2;1){
            // 创建每一格的画布
            var tile = gdip.bitmap(cw, ch);
            var graphics = tile.getGraphics();
            
            // 注意:这里必须使用 drawImageRectRect
            // 参数:图像, 目标左, 目标上, 目标宽, 目标高, 源左, 源上, 源宽, 源高
            graphics.drawImageRectRect(bmp, 
                0, 0, cw, ch, // 目标矩形(tile 画布上的坐标)
                col * cw, row * ch, cw, ch // 源矩形(原图上的坐标)
            );
            
            // 保存单张切片
            var savePath = outDir + "/tile_" + (row * 3 + col + 1) + ".png";
            tile.save(savePath);
            
            // 释放 GDI+ 对象
            graphics.delete();
            tile.delete();
        }
    }
    
    bmp.delete();
    process.explore(outDir);
    winform.msgbox("九宫格分割完成!已保存至:" + outDir);
}

winform.show();
win.loopMessage();

六、界面

相关推荐
李长渊哦26 分钟前
Qoder 自定义子智能体(Subagent)学习笔记
chrome·笔记·学习
pixelpilot35 分钟前
Deta Surf:把笔记、文件和网页塞进同一个 AI 工作台
笔记·其他
蒸蒸yyyyzwd1 小时前
学习笔记 复盘
笔记·八股
旖旎夜光2 小时前
【C++ 基础入门】命名空间、输入输出、缺省参数与函数重载
开发语言·c++·笔记·学习
一支蜉蝣5 小时前
Day26 XD安全学习笔记--PHP 应用&模版引用&Smarty渲染&MVC 模型&数据联动&RCE 安全
笔记·网络安全·html·php
東隅已逝,桑榆非晚5 小时前
算法3.双指针法-快乐数
c++·笔记·学习·算法
欢欢李5 小时前
【LTE L3 笔记 01】LTE空口特点
笔记·无线通信·物理层·lte·空口协议
ZZHow10246 小时前
神经网络与深度学习笔记_Day1
人工智能·pytorch·笔记·python·深度学习·神经网络·机器学习
ACP广源盛139246256736 小时前
选型笔记:HDMI2.1 四进一出切换中继方案 GSV6705@ACP 评估
笔记·硬件架构·硬件工程·视频·国产芯片
Z21-X7 小时前
云原生运维实战笔记:华为云存储类服务全景解析——EVS、OBS、SFS与CBR深度实践
运维·笔记·学习·云原生·华为云