You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ImageJ宏处理子目录中BRIGHT文件夹TIFF图像失败求助

ImageJ宏排查与修正

问题描述

编写ImageJ宏实现以下功能:

  1. 选择输入目录
  2. 创建输出目录
  3. 在多级子目录中搜索包含“BRIGHT”的文件夹,对其中的TIFF图像进行预处理(转8位、复制)并保存到输出目录

但运行宏后仅生成空输出文件夹,未执行任何图像处理操作。原代码如下:

// select folder with "BRIGHT" images
inputDir = getDirectory("Choose your input directory"); // `inputDir` stores the path of the input directory

// select output directory
outputDir = getDirectory("Choose your output directory"); // `outputDir` stores the output path
newFolderName = getString("Name of the new folder:", "NewFolder");
newDir = outputDir + File.separator + newFolderName; // `newDir` stores the path of the output folder
File.makeDirectory(newDir);

setBatchMode(true); // batch processing, avoids updating the interface in each operation

// To search for BRIGHT at any level

function searchAndProcess(inputDir, parentPath) {
    if (inputDir == null || inputDir.length() == 0) { // check if the directory is empty
        print("Invalid or empty directory.");
        return;
    }
    
    fileList1 = getFileList(inputDir); // `fileList1` stores a list of files in the BRIGHT folder
    for (i = 0; i < fileList1.length; i++) { // create a loop
        currentPath = inputDir + File.separator + fileList1[i]; // stores the full path for each file in `currentPath`
        showProgress(i, fileList1.length); // shows a progress bar
        
        if (File.isDirectory(currentPath)) { // check if `currentPath` is a directory
            if (matches(fileList1[i], "*BRIGHT*")) {
                // Create a subfolder in the destination for this BRIGHT folder
                brightSubDir = newDir + File.separator + (parentPath.length() > 0 ? parentPath + "_" : "") + fileList1[i];
                if (!File.exists(brightSubDir)) {
                    File.makeDirectory(brightSubDir);
                    
                    // List and process the TIFF files in the BRIGHT folder
                    brightFiles = getFileList(currentPath);
                    for (j = 0; j < brightFiles.length; j++) {
                        sourceFile = currentPath + File.separator + brightFiles[j];
                        if (!File.isDirectory(sourceFile) && endsWith(brightFiles[j], ".tif")) { // pre-processing
                            open(sourceFile);
                            run("8-bit");
                            run("Duplicate...", "duplicate");
                            saveAs("Tiff", brightSubDir + File.separator + brightFiles[j]); 
                            close(); // Closes the duplicated image
                        }
                    }
                }
            } else { // Recursion: search in subdirectories
                newParentPath = (parentPath.length() > 0) ? parentPath + "_" + fileList1[i] : fileList1[i];
                searchAndProcess(currentPath, newParentPath);
            }
        }
    }
}

print("TIFF files processed and saved in: " + newDir);

问题排查

  1. 核心问题:递归函数未执行
    代码中定义了searchAndProcess核心处理函数,但从未调用该函数,导致搜索和图像处理逻辑完全未启动。

  2. 图像关闭不彻底
    处理流程中仅关闭了复制的图像副本,转8位后的原图仍保留在内存中,可能导致后续处理异常或内存溢出。

  3. TIFF后缀匹配不全
    仅匹配.tif小写后缀,会漏掉.TIF、.tiff、.TIFF格式的文件。

  4. 目录存在时跳过处理
    若目标子目录已存在,会直接跳过该BRIGHT文件夹内的所有图像处理,不符合重新处理或覆盖需求。

修正后的代码

// select folder with "BRIGHT" images
inputDir = getDirectory("Choose your input directory");
if (inputDir == null || inputDir.length() == 0) {
    print("Invalid input directory selected.");
    exit();
}

// select output directory
outputDir = getDirectory("Choose your output directory");
if (outputDir == null || outputDir.length() == 0) {
    print("Invalid output directory selected.");
    exit();
}
newFolderName = getString("Name of the new folder:", "NewFolder");
newDir = outputDir + File.separator + newFolderName;
File.makeDirectory(newDir);

setBatchMode(true);

// Recursive function to search BRIGHT folders and process images
function searchAndProcess(inputDir, parentPath) {
    fileList = getFileList(inputDir);
    for (i = 0; i < fileList.length; i++) {
        currentPath = inputDir + File.separator + fileList[i];
        showProgress(i, fileList.length);
        
        if (File.isDirectory(currentPath)) {
            // Match folders containing "BRIGHT" (case-insensitive)
            if (matches(fileList[i], "*BRIGHT*") || matches(fileList[i], "*bright*")) {
                // Create output subfolder with parent path prefix
                brightSubDir = newDir + File.separator + (parentPath.length() > 0 ? parentPath + "_" : "") + fileList[i];
                File.makeDirectory(brightSubDir); // ImageJ allows duplicate directory creation without error
                
                // Process all TIFF files in the BRIGHT folder
                brightFiles = getFileList(currentPath);
                for (j = 0; j < brightFiles.length; j++) {
                    sourceFile = currentPath + File.separator + brightFiles[j];
                    fileName = brightFiles[j];
                    // Match all common TIFF extensions
                    if (!File.isDirectory(sourceFile) && 
                        (endsWith(fileName, ".tif") || endsWith(fileName, ".TIF") || 
                         endsWith(fileName, ".tiff") || endsWith(fileName, ".TIFF"))) {
                        
                        open(sourceFile);
                        run("8-bit");
                        run("Duplicate...", "duplicate");
                        // Save the duplicated image
                        saveAs("Tiff", brightSubDir + File.separator + fileName);
                        // Close both duplicated image and original 8-bit image
                        close();
                        close(getTitle());
                    }
                }
            } else {
                // Recurse into subdirectories
                newParentPath = parentPath.length() > 0 ? parentPath + "_" + fileList[i] : fileList[i];
                searchAndProcess(currentPath, newParentPath);
            }
        }
    }
}

// Execute the recursive search and processing
searchAndProcess(inputDir, "");

print("Processing completed. TIFF files saved in: " + newDir);
setBatchMode(false);

关键修正点

  • 添加searchAndProcess(inputDir, "");调用,启动核心处理逻辑
  • 完善图像关闭逻辑,确保原图和副本都被关闭
  • 扩展TIFF后缀匹配,覆盖大小写和长短格式
  • 移除目录存在判断,强制创建目录(ImageJ中重复创建无报错),保证即使目录已存在也会处理图像
  • 增加输入/输出目录的有效性判断,避免空目录导致的异常
  • 增加大小写不敏感的BRIGHT文件夹匹配

内容的提问来源于stack exchange,提问作者NICOLAS ROA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 23:45:17