Board logo

标题: [文件操作] N个文件夹里面有N多JPG格式的图片,能找出带彩色照片的文件吗[已解决] [打印本页]

作者: 001011    时间: 2019-3-27 20:09     标题: N个文件夹里面有N多JPG格式的图片,能找出带彩色照片的文件吗[已解决]

N个文件夹里面有N多JPG格式的图片,其中有一种是图片幅面内接近底部有照片的 其他的图基本没有颜色(最起码没有彩色相片的颜色那么多),我想找出这些带彩色相片的图,并在这个图片文件名的最后加上一个“C”作为标记。可以做到吗  谢谢
文件名的格式为:000001.jpg 000002.jpg......000100.jpg
带照片的图片样例:
作者: bailong360    时间: 2019-3-27 21:17

本帖最后由 bailong360 于 2019-3-27 21:23 编辑

批处理好像还真不好办...
提供一个思路, 使用 ImageMagick 的 convert 工具计算图片的平均颜色, 若 RGB 任意两项相差大于 2 则认定为有其它颜色 (
  1. convert test.jpg -scale "1x1\!" -format "%[pixel:s]" info:-
复制代码
LZ 可以先试试识别效果如何 (其实是太久没写批处理了手生了
作者: 惆怅而又凄凉    时间: 2019-3-27 21:54

本帖最后由 惆怅而又凄凉 于 2019-3-27 21:59 编辑

我给个建议吧。。。你们别笑话我!

按键精灵了解一下?

2楼的思路可能有一个bug,我不确定啊!
1楼那种图片很可能存在灰度问题,不知道这样情况下灰度算不算一个独立颜色?

设计逻辑:
首先复制所有图片到一个新文件夹,可以有子文件夹。
使用图片查看器打开文件夹,或者用搜索搜索出*.jpg,然后图片查看器打开。
按键精灵设置区域找色,模糊设70%。

如果找不到则按删除按钮自动进入下一张,如果找得到则按右箭头按钮。

最终将会呈现出文件夹剩余文件均为彩色,回收站文件均为黑白。

然后使用bat将文件夹内包括子文件夹的所有文件名的最后加一个C,然后还原回收站的文件。
作者: 523066680    时间: 2019-3-27 22:46

回复 2# bailong360


    现在 ImageMagick 的新版本,不直接convert(可能就是考虑和系统的convert冲突吧)
已经改为了
magick convert 参数
magick identify 参数
这样的形式
作者: 001011    时间: 2019-3-27 23:10

回复 3# 惆怅而又凄凉
我也首先想到的按键精灵,但是太慢,我的图片有十几万页呢
作者: flashercs    时间: 2019-3-28 06:49

本帖最后由 flashercs 于 2019-3-28 06:55 编辑

用powershell找色也行吧.设 RGB中至少两个原色不同的点为彩色点,当图片底部的1/3区域中的彩色点数量达到10%时 ,该图片被认为是彩图.
下面代码并未真正重命名图片,只是找出符合条件的图片; 保存为 "彩图".bat,设置变量PicturePath为要处理的图片或所在目录的路径列表,以空格分隔开
  1. @echo off
  2. set PicturePath="E:\test\dir1" "E:\test\dir2" "E:\test\dir3" "E:\test\dir4\00053.jpg"
  3. for /f "tokens=1 delims=:" %%A in ('findstr /n "#######*" %0') do more +%%A %0 >"%~dpn0.ps1"
  4. powershell.exe -ExecutionPolicy Bypass -File "%~dpn0.ps1" %PicturePath%
  5. pause
  6. exit /b
  7. ################################################################
  8. [boolean]$isRecursive = $false # 是否处理子目录
  9. function testColor {
  10.   param (
  11.     [string]$filepath
  12.   )
  13.   $bitmap = New-Object -TypeName System.Drawing.Bitmap -ArgumentList $filepath
  14.   # $bitmap = [System.Drawing.Bitmap]::new($filepath)
  15.   $height = $bitmap.Height
  16.   $width = $bitmap.Width
  17.   # 彩色点数目下限设置为图片底部1/3的点数的10%
  18.   $minPoints = [System.Math]::Floor(0.1 * $width * $height / 3)
  19.   $count = 0
  20.   $flag = $false
  21.   :outer
  22.   for ($y = [System.Math]::Ceiling($height * 2 / 3) - 1; $y -lt $height; $y++) {
  23.     for ($x = 0; $x -lt $width; $x++) {
  24.       $color = $bitmap.GetPixel($x, $y)
  25.       if (!($color.R -eq $color.G -and $color.R -eq $color.B)) {
  26.         if (++$count -ge $minPoints) {
  27.           $flag = $true
  28.           break outer
  29.         }
  30.       }
  31.     }
  32.   }
  33.   # Write-Host "`$y = $y;`$x = $x" -ForegroundColor Magenta
  34.   $bitmap.Dispose()
  35.   return $flag
  36. }
  37. function genFile {
  38.   param (
  39.     [string]$filepath
  40.   )
  41.   Write-Host $filepath -ForegroundColor Green
  42.   if (testColor $filepath) {
  43.     Rename-Item -LiteralPath $filepath -NewName ([System.IO.Path]::GetFileNameWithoutExtension($filepath) + 'C' + [System.IO.Path]::GetExtension($filepath)) -WhatIf
  44.   }
  45. }
  46. function genFolder {
  47.   param (
  48.     [string]$folderPath,
  49.     [switch]$recurse
  50.   )
  51.   if ($recurse) {
  52.     Get-ChildItem -LiteralPath $folderPath -Filter '*.jpg' -File -Recurse|ForEach-Object {genFile $_.FullName}
  53.   }
  54.   else {
  55.     Get-ChildItem -LiteralPath $folderPath -Filter '*.jpg' -File|ForEach-Object {genFile $_.FullName}
  56.   }
  57. }
  58. Add-Type -AssemblyName System.Drawing|Out-Null
  59. Write-Host "`$args.Count=$($args.Count)"
  60. foreach ($item in $args) {
  61.   if ((Get-Item -LiteralPath $item).Attributes -band [System.IO.FileAttributes]::Directory) {
  62.     genFolder $item $isRecursive
  63.   }
  64.   else {
  65.     genFile $item
  66.   }
  67. }
复制代码

作者: 001011    时间: 2019-3-28 09:41

回复 6# flashercs
感谢 测试中
执行情况不乐观
作者: 523066680    时间: 2019-3-28 17:03

士多啤梨 Perl
  1. # Strawberry Perl 5.24
  2. use Imager;
  3. use File::Basename qw/basename/;
  4. my $threshold = 10000;
  5. my ($colors, $newname);
  6. for my $f (glob "*.jpg")
  7. {
  8.     next if $f =~/C\.jpg/;      # 如果已经改名就跳过
  9.     $colors = count_color($f);  # 获取颜色计数
  10.     printf "%6d %s %s\n", $colors, $f, $colors > $threshold ? "Colorful" : "";
  11.     if ( $colors > $threshold )
  12.     {
  13.         $newname = $f;
  14.         $newname=~s/(\.jpg)$/C$1/;
  15.         rename $f, $newname;
  16.     }
  17. }
  18. sub count_color
  19. {
  20.     my $file = shift;
  21.     my $img = Imager->new(file=>$file) or die Imager->errstr();
  22.     return $img->getcolorcount();
  23. }
复制代码
输出示例
  1. 19326 000005.jpg Colorful
  2.   4156 000006.jpg
复制代码

作者: bailong360    时间: 2019-3-28 19:36

本帖最后由 bailong360 于 2019-3-28 20:00 编辑

来个 Rust 的
  1. use image::GenericImageView;
  2. use std::path::{Path, PathBuf};
  3. // 提取 RGB 的平均方差
  4. fn rgb_variance<P: AsRef<Path>>(path: P) -> f64 {
  5.     let img = image::open(path).expect("无法打开");
  6.     stats::mean(img.pixels().map(|(_, _, rgba)| {
  7.         stats::variance(rgba.data.iter().take(3).cloned())
  8.     }))
  9. }
  10. // 文件名后加入 "C"
  11. fn rename(path: PathBuf) {
  12.     let mut new_path = path.clone();
  13.     let base_name = path.file_name().unwrap().to_str().unwrap();
  14.     new_path.set_file_name(base_name.replace(".", "C."));
  15.     println!("  rename {}", path.display());
  16.     std::fs::rename(path, new_path).expect("重命名失败");
  17. }
  18. fn main() {
  19.     // 从环境变量中读取阈值, 默认 1.0
  20.     let threshold = std::env::var("THRESHOLD")
  21.         .map(|v| v.parse::<f64>().unwrap())
  22.         .unwrap_or(1.0);
  23.     for entry in glob::glob("*.jpg").unwrap() {
  24.         let path = entry.unwrap();
  25.         let rgb_variance = rgb_variance(&path);
  26.         println!("{:}\t{}", rgb_variance, path.display());
  27.         if rgb_variance > threshold {
  28.             rename(path);
  29.         }
  30.     }
  31. }
复制代码
可以通过环境变量 THRESHOLD 指定阈值, 默认 1.0

下载地址: https://send.firefox.com/downloa ... 2Rsz_HhEtyBcV_3maww

交叉编译真爽!
Firefox Send 真爽!
作者: 001011    时间: 2019-3-29 22:24

回复 9# bailong360
非常好用  我调到了9.0  
就是只能在一个文件夹运行  其他很ok
感谢
作者: bailong360    时间: 2019-3-29 22:42

回复 10# 001011


    不客气. 问题解决后,请编辑顶楼帖子在标题前面注明[已解决]
作者: 001011    时间: 2019-4-2 20:24

回复  001011


    不客气. 问题解决后,请编辑顶楼帖子在标题前面注明[已解决]
bailong360 发表于 2019-3-29 22:42

您好  还再帮我改改吗  现在的程序一次只能处理不到两千张图就停掉了
能一次性处理的多些吗
谢谢
作者: bailong360    时间: 2019-4-3 09:20

回复 12# 001011


    这显然是意料之外的bug——有报错吗
作者: 001011    时间: 2019-4-3 10:54

本帖最后由 001011 于 2019-4-3 11:19 编辑

回复 13# bailong360
抱歉  可能是某张图片文件有问题
我刚刚测试了一下  没问题了
作者: Batcher    时间: 2019-7-12 16:16

回复 1# 001011


8楼是Perl代码,可以这样执行:
http://bbs.bathome.net/thread-12483-1-1.html




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2