找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 32948|回复: 14

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

[复制链接]
发表于 2019-3-27 20:09:13 | 显示全部楼层 |阅读模式
N个文件夹里面有N多JPG格式的图片,其中有一种是图片幅面内接近底部有照片的 其他的图基本没有颜色(最起码没有彩色相片的颜色那么多),我想找出这些带彩色相片的图,并在这个图片文件名的最后加上一个“C”作为标记。可以做到吗  谢谢
文件名的格式为:000001.jpg 000002.jpg......000100.jpg
带照片的图片样例:
发表于 2019-3-27 21:17:28 | 显示全部楼层
本帖最后由 bailong360 于 2019-3-27 21:23 编辑

批处理好像还真不好办...
提供一个思路, 使用 ImageMagick 的 convert 工具计算图片的平均颜色, 若 RGB 任意两项相差大于 2 则认定为有其它颜色 (

  1. convert test.jpg -scale "1x1\!" -format "%[pixel:s]" info:-
复制代码
LZ 可以先试试识别效果如何 (其实是太久没写批处理了手生了

评分

参与人数 2技术 +2 收起 理由
001011 + 1 谢谢啦
523066680 + 1 我也想到 magick

查看全部评分

发表于 2019-3-27 21:54:31 | 显示全部楼层
本帖最后由 惆怅而又凄凉 于 2019-3-27 21:59 编辑

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

按键精灵了解一下?

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

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

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

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

然后使用bat将文件夹内包括子文件夹的所有文件名的最后加一个C,然后还原回收站的文件。

评分

参与人数 1技术 +1 收起 理由
001011 + 1 谢谢

查看全部评分

发表于 2019-3-27 22:46:46 | 显示全部楼层
回复 2# bailong360


    现在 ImageMagick 的新版本,不直接convert(可能就是考虑和系统的convert冲突吧)
已经改为了
magick convert 参数
magick identify 参数
这样的形式

评分

参与人数 2技术 +2 收起 理由
bailong360 + 1 soga! 我用的是旧版(新版有些bug
001011 + 1 感谢

查看全部评分

 楼主| 发表于 2019-3-27 23:10:51 | 显示全部楼层
回复 3# 惆怅而又凄凉
我也首先想到的按键精灵,但是太慢,我的图片有十几万页呢
发表于 2019-3-28 06:49:40 | 显示全部楼层
本帖最后由 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. }
复制代码

评分

参与人数 4技术 +4 收起 理由
smss + 1
老刘1号 + 1 66
001011 + 1 非常感谢
bailong360 + 1 GJ

查看全部评分

 楼主| 发表于 2019-3-28 09:41:39 | 显示全部楼层
回复 6# flashercs
感谢 测试中
执行情况不乐观
发表于 2019-3-28 17:03:21 | 显示全部楼层
士多啤梨 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
复制代码

评分

参与人数 3技术 +3 收起 理由
老刘1号 + 1 +1
001011 + 1 谢谢 辛苦啦
bailong360 + 1 perl

查看全部评分

发表于 2019-3-28 19:36:39 | 显示全部楼层
本帖最后由 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 真爽!

评分

参与人数 6PB +6 技术 +6 收起 理由
smss + 1 抱抱大腿
CrLf + 1 1
老刘1号 + 1 +1
001011 + 1 感谢 调整到9。0后 运行OK
codegay + 1 1

查看全部评分

 楼主| 发表于 2019-3-29 22:24:42 | 显示全部楼层
回复 9# bailong360
非常好用  我调到了9.0  
就是只能在一个文件夹运行  其他很ok
感谢
发表于 2019-3-29 22:42:55 | 显示全部楼层
回复 10# 001011


    不客气. 问题解决后,请编辑顶楼帖子在标题前面注明[已解决]

评分

参与人数 1PB +10 收起 理由
CrLf + 10 十分感谢

查看全部评分

 楼主| 发表于 2019-4-2 20:24:14 | 显示全部楼层
回复  001011


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

您好  还再帮我改改吗  现在的程序一次只能处理不到两千张图就停掉了
能一次性处理的多些吗
谢谢
发表于 2019-4-3 09:20:49 | 显示全部楼层
回复 12# 001011


    这显然是意料之外的bug——有报错吗
 楼主| 发表于 2019-4-3 10:54:35 | 显示全部楼层
本帖最后由 001011 于 2019-4-3 11:19 编辑

回复 13# bailong360
抱歉  可能是某张图片文件有问题
我刚刚测试了一下  没问题了
发表于 2019-7-12 16:16:15 | 显示全部楼层
回复 1# 001011


8楼是Perl代码,可以这样执行:
http://bbs.bathome.net/thread-12483-1-1.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 05:20 , Processed in 0.019224 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表