PowerShell实现读取照片并做灰度处理

Powershell一直是我的学习目标。做一个小例子。PowerShell实现读取照片并做灰度处理。还想要保存这张灰度照片并直接打开查看。

 

分析需求:

【读取照片】  需要借助.net framework中的程序集 System.Drawing

【灰度处理】  需要做图像处理----灰度处理,需要重新计算每个像素信息,使用灰阶转换公式  L = 0.299*R + 0.587*G + 0.114*B

【保存照片】  同样需要System.Drawing程序集

【打开文件】  使用  Invoke-Item  命令  或者 

 

设计脚本:

Add-Type -AssemblyName System.Drawing

# 定义根目录下的图片路径(假设文件名为 input.jpg)
$inputPath = Join-Path $PSScriptRoot "input.jpg"
$outputPath = Join-Path $PSScriptRoot "output.jpg"

# 检查输入文件是否存在
if (-not (Test-Path $inputPath)) {
    Write-Host "错误:根目录下未找到 input.jpg 文件!"
    exit
}

try {
    # 加载原始图片
    $originalImage = [System.Drawing.Bitmap]::FromFile($inputPath)
    # 创建灰度图像对象
    $grayImage = New-Object System.Drawing.Bitmap($originalImage.Width, $originalImage.Height)

    # 遍历每个像素进行灰度化处理
    for ($x = 0; $x -lt $originalImage.Width; $x++) {
        for ($y = 0; $y -lt $originalImage.Height; $y++) {
            $pixel = $originalImage.GetPixel($x, $y)
            # 计算灰度值(加权平均法)
            $grayValue = [int](0.299 * $pixel.R + 0.587 * $pixel.G + 0.114 * $pixel.B)
            $grayColor = [System.Drawing.Color]::FromArgb($grayValue, $grayValue, $grayValue)
            $grayImage.SetPixel($x, $y, $grayColor)
        }
    }

    # 保存黑白图片
    $grayImage.Save($outputPath, [System.Drawing.Imaging.ImageFormat]::Jpeg)
    Write-Host "已生成黑白图片:$outputPath"

    # 使用默认程序展示图片
    Invoke-Item $outputPath
}
catch {
    Write-Host "处理过程中发生错误:$_"
}
finally {
    # 释放资源
    if ($originalImage) { $originalImage.Dispose() }
    if ($grayImage) { $grayImage.Dispose() }
}

 

PS:  

 $grayValue = [int](0.299 * $pixel.R + 0.587 * $pixel.G + 0.114 * $pixel.B)

其中,grayValue 是灰阶值,R、G、B分别是红色、绿色和蓝色通道的值。这个公式是基于人眼对不同颜色敏感度的研究结果得出的。在这个公式中,绿色的权重最高,因为人眼对绿色最为敏感,其次是红色,最后是蓝色。这种权重分配在早期电视技术中被采纳,以模拟人眼感知亮度的方式优化信号传输。

 

ok!   脚本运行后,会在其根目录下生成 output.jpg 文件,系统会使用默认软件打开该图片文件,可看到最后效果。下面给出参考结果。

     

 

posted @ 2025-02-25 20:58  SHARP-EYE  阅读(56)  评论(0)    收藏  举报