如何在 Windows 10 上将一组图像切成两半?

如何在 Windows 10 上将一组图像切成两半?

我有 50 张图片。我需要将每张图片切成两半(垂直切割)。如何在 Windows 10 上通过批处理执行此操作(= 无需逐张手动剪切每张图片)?所有图片都在一个文件夹中。

例如,图像

在此处输入图片描述

被剪切成以下2幅图:

在此处输入图片描述在此处输入图片描述

有时所有图像的尺寸或纵横比都相同,有时则不同。我可以使用在 Windows 上运行的任何图像处理软件。

答案1

据我所知,Windows 没有原生的图像分割应用程序,但是有一个非常著名的免费实用程序 Imagemagick,可用于 Linux、Mac OS X、iOS 和 Windows。

您可以在此处下载安装程序(向上/向下滚动可查看其他操作系统版本)

https://imagemagick.org/script/download.php#windows

选择合适的 32 位或 64 位二进制文​​件。我有 64 位 Windows 10,我选择

ImageMagick-7.1.0-51-Q16-HDRI-x64-dll.exe

运行安装程序,并确保选中安装旧版实用程序的复选框。

在此处输入图片描述

安装程序完成后,Windows 的“Program Files”文件夹中会有一个文件夹,名称类似

C:\Program Files\ImageMagick-7.1.0-Q16-HDRI

此文件夹中将有一个名为“convert.exe”的命令行可执行文件。

请不要将其与位于 C:\Windows\system32\ 中的名为 convert.exe 的 Windows 程序混淆,该程序可将 FAT 卷转换为 NTFS。

现在,你可以在包含 50 个图像文件的文件夹中创建一个批处理脚本,如下所示

@echo off
for %%A in (*.jpg) do (
    "C:\Program Files\ImageMagick-7.1.0-Q16-HDRI\convert.exe" -crop 50%%x100%% "%%~nxA" "%%~nA-split%%~xA" 
)

您需要更改指定的文件扩展名,如果不是.jpg

更新程序中的文件路径以匹配计算机上的实际文件路径。

这是我得到的。左侧分割是 split-0.jpg 文件,右侧分割是 split-1.jpg 文件。

在此处输入图片描述

答案2

用于图像处理伊凡视界许多用户在 Windows 下安装了它。作为 ImageMagick 的替代解决方案,有一个保存图片块对话框可处理一个(或几个)文件。也可以通过 GUI 中的设置进行批处理。

请注意并警告 - 保留原件(保存副本)以防出现问题。

文件夹中多个文件的用例

拥有多张不同尺寸的图像需要几个步骤。

从主菜单执行以下步骤:

  • 文件 > 打开并打开一张图片
  • 文件 > 缩略图(或使用快捷方式T)。这将打开 IrfanView 缩略图。
  • 在缩略图视图中按尺寸对图像进行排序
  • 选项 > 排序缩略图 > 按图像宽度

在此处输入图片描述

  • 选择所有具有相同图像宽度(例如 2048px)的文件。
  • 文件 > 使用选定文件启动批处理对话框...(或使用快捷方式B)。请注意,选定的文件现在列在中Input files
  • 选择批量转换 - 重命名结果文件在下面Work As
  • 点击批量转换设置 Advanced裁剪 x 偏移:0和宽度(例如1024px)并Left top进行第一次传递,如屏幕截图所示。Save settings根据您的需要使用。
  • 打开批量重命名设置. 设置名称模式$N_1
  • 浏览输出文件夹或使用当前文件夹。
  • 点击开始批次

在此处输入图片描述

  • 使用Return to batch按钮。
  • 再次打开批量重命名设置并设置名称模式$N_2
  • 再次点击批量转换设置 Advanced裁剪 x 偏移:0和宽度(例如1024px)并Right top进行第二遍。

选择具有不同尺寸的其他图像并重复上述步骤。

仅适用于单个文件(可能只有几个文件)

从主菜单使用:

  • 文件 > 打开
  • 选项 > 导出图像拼块(分割图像)...
  • 根据需要设置图块数量(列和行),例如 2 x 1

在此处输入图片描述

答案3

它必须是批处理吗?如果它可以是 Powershell 脚本,那么;

  • 将其保存为SomeName.ps1
  • 右击它
  • 选择“使用 PowerShell 运行”。

如果您没有创建文件夹,它将创建一个空文件夹,您可以在其中放置图像(我假设是 jpg 图像),您还可以选择要剪切它们的方向(无第三方:));

param (
    [string]$cutDirection = ""
)

if (-not $cutDirection) {
    $cutDirection = Read-Host "Enter '(h)orizontal' or '(v)ertical' to specify the cut direction.`nPress Enter for default (horizontal)"
}

if ($cutDirection -notin @("horizontal", "h", "vertical", "v")) {
    Write-Host "Invalid cut direction. Defaulting to 'horizontal'."
    $cutDirection = "horizontal"
}

Write-Host "Getting the current directory..."
$currentDir = $PSScriptRoot
Write-Host "Current directory: $currentDir"

$imagesFolder = Join-Path -Path $currentDir -ChildPath "Images"

if (-not (Test-Path -Path $imagesFolder -PathType Container)) {
    Write-Host "Images folder not found. Exiting..."
    Exit
}

Write-Host "Changing to the Images folder..."
Set-Location -Path $imagesFolder
Write-Host "Current directory: $PWD"

$outputFolder = Join-Path -Path $currentDir -ChildPath "CutImages"
if (-not (Test-Path -Path $outputFolder -PathType Container)) {
    Write-Host "Creating output folder for cut images..."
    New-Item -Path $outputFolder -ItemType Directory | Out-Null
    Write-Host "Output folder created: $outputFolder"
}

Add-Type -AssemblyName System.Drawing

Write-Host "Collecting list of JPG files..."
$jpgFiles = Get-ChildItem -Path $currentDir -Filter *.jpg -Recurse
if ($jpgFiles.Count -eq 0) {
    Write-Host "No JPG files found in the parent folder."
    Exit
}

Write-Host "Processing JPG files..."
foreach ($file in $jpgFiles) {
    Write-Host "Processing: $($file.FullName)"
    $image = $null
    try {
        $image = [System.Drawing.Image]::FromFile($file.FullName)
    } catch {
        Write-Host "Error loading image: $($_.Exception.Message)"
        continue
    }

    if ($image -eq $null) {
        Write-Host "Failed to load image $($file.FullName). Skipping..."
        continue
    }

    $width = $image.Width
    $height = $image.Height
    Write-Host "Image dimensions: Width = $width, Height = $height"

    if ($cutDirection -eq "horizontal" -or $cutDirection -eq "h") {
        Write-Host "Cutting $($file.Name) horizontally..."
        $newWidth = [math]::Round($width / 2)
        $newImageA = $image.Clone([System.Drawing.Rectangle]::FromLTRB(0, 0, $newWidth, $height), $image.PixelFormat)
        $newImageA.Save("$outputFolder\$($file.BaseName)_a.jpg")
        $newImageB = $image.Clone([System.Drawing.Rectangle]::FromLTRB($newWidth, 0, $width, $height), $image.PixelFormat)
        $newImageB.Save("$outputFolder\$($file.BaseName)_b.jpg")
        Write-Host "$($file.Name) cut horizontally."
    }
    else {
        Write-Host "Cutting $($file.Name) vertically..."
        $newHeight = [math]::Round($height / 2)
        $newImageA = $image.Clone([System.Drawing.Rectangle]::FromLTRB(0, 0, $width, $newHeight), $image.PixelFormat)
        $newImageA.Save("$outputFolder\$($file.BaseName)_a.jpg")
        $newImageB = $image.Clone([System.Drawing.Rectangle]::FromLTRB(0, $newHeight, $width, $height), $image.PixelFormat)
        $newImageB.Save("$outputFolder\$($file.BaseName)_b.jpg")
        Write-Host "$($file.Name) cut vertically."
    }
    $image.Dispose()
}

Write-Host "Image processing complete."

相关内容