标题: [文件操作] 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 则认定为有其它颜色 (- 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为要处理的图片或所在目录的路径列表,以空格分隔开- @echo off
- set PicturePath="E:\test\dir1" "E:\test\dir2" "E:\test\dir3" "E:\test\dir4\00053.jpg"
- for /f "tokens=1 delims=:" %%A in ('findstr /n "#######*" %0') do more +%%A %0 >"%~dpn0.ps1"
- powershell.exe -ExecutionPolicy Bypass -File "%~dpn0.ps1" %PicturePath%
- pause
- exit /b
- ################################################################
- [boolean]$isRecursive = $false # 是否处理子目录
- function testColor {
- param (
- [string]$filepath
- )
- $bitmap = New-Object -TypeName System.Drawing.Bitmap -ArgumentList $filepath
- # $bitmap = [System.Drawing.Bitmap]::new($filepath)
- $height = $bitmap.Height
- $width = $bitmap.Width
- # 彩色点数目下限设置为图片底部1/3的点数的10%
- $minPoints = [System.Math]::Floor(0.1 * $width * $height / 3)
- $count = 0
- $flag = $false
- :outer
- for ($y = [System.Math]::Ceiling($height * 2 / 3) - 1; $y -lt $height; $y++) {
- for ($x = 0; $x -lt $width; $x++) {
- $color = $bitmap.GetPixel($x, $y)
- if (!($color.R -eq $color.G -and $color.R -eq $color.B)) {
- if (++$count -ge $minPoints) {
- $flag = $true
- break outer
- }
- }
- }
- }
- # Write-Host "`$y = $y;`$x = $x" -ForegroundColor Magenta
- $bitmap.Dispose()
- return $flag
- }
- function genFile {
- param (
- [string]$filepath
- )
- Write-Host $filepath -ForegroundColor Green
- if (testColor $filepath) {
- Rename-Item -LiteralPath $filepath -NewName ([System.IO.Path]::GetFileNameWithoutExtension($filepath) + 'C' + [System.IO.Path]::GetExtension($filepath)) -WhatIf
- }
- }
- function genFolder {
- param (
- [string]$folderPath,
- [switch]$recurse
- )
- if ($recurse) {
- Get-ChildItem -LiteralPath $folderPath -Filter '*.jpg' -File -Recurse|ForEach-Object {genFile $_.FullName}
- }
- else {
- Get-ChildItem -LiteralPath $folderPath -Filter '*.jpg' -File|ForEach-Object {genFile $_.FullName}
- }
- }
- Add-Type -AssemblyName System.Drawing|Out-Null
- Write-Host "`$args.Count=$($args.Count)"
- foreach ($item in $args) {
- if ((Get-Item -LiteralPath $item).Attributes -band [System.IO.FileAttributes]::Directory) {
- genFolder $item $isRecursive
- }
- else {
- genFile $item
- }
- }
复制代码
作者: 001011 时间: 2019-3-28 09:41
回复 6# flashercs
感谢 测试中
执行情况不乐观
作者: 523066680 时间: 2019-3-28 17:03
士多啤梨 Perl- # Strawberry Perl 5.24
- use Imager;
- use File::Basename qw/basename/;
- my $threshold = 10000;
- my ($colors, $newname);
-
- for my $f (glob "*.jpg")
- {
- next if $f =~/C\.jpg/; # 如果已经改名就跳过
- $colors = count_color($f); # 获取颜色计数
- printf "%6d %s %s\n", $colors, $f, $colors > $threshold ? "Colorful" : "";
- if ( $colors > $threshold )
- {
- $newname = $f;
- $newname=~s/(\.jpg)$/C$1/;
- rename $f, $newname;
- }
- }
-
- sub count_color
- {
- my $file = shift;
- my $img = Imager->new(file=>$file) or die Imager->errstr();
- return $img->getcolorcount();
- }
复制代码
输出示例- 19326 000005.jpg Colorful
- 4156 000006.jpg
复制代码
作者: bailong360 时间: 2019-3-28 19:36
本帖最后由 bailong360 于 2019-3-28 20:00 编辑
来个 Rust 的- use image::GenericImageView;
- use std::path::{Path, PathBuf};
-
- // 提取 RGB 的平均方差
- fn rgb_variance<P: AsRef<Path>>(path: P) -> f64 {
- let img = image::open(path).expect("无法打开");
- stats::mean(img.pixels().map(|(_, _, rgba)| {
- stats::variance(rgba.data.iter().take(3).cloned())
- }))
- }
-
- // 文件名后加入 "C"
- fn rename(path: PathBuf) {
- let mut new_path = path.clone();
- let base_name = path.file_name().unwrap().to_str().unwrap();
- new_path.set_file_name(base_name.replace(".", "C."));
- println!(" rename {}", path.display());
- std::fs::rename(path, new_path).expect("重命名失败");
- }
-
- fn main() {
- // 从环境变量中读取阈值, 默认 1.0
- let threshold = std::env::var("THRESHOLD")
- .map(|v| v.parse::<f64>().unwrap())
- .unwrap_or(1.0);
-
- for entry in glob::glob("*.jpg").unwrap() {
- let path = entry.unwrap();
- let rgb_variance = rgb_variance(&path);
- println!("{:}\t{}", rgb_variance, path.display());
- if rgb_variance > threshold {
- rename(path);
- }
- }
- }
复制代码
可以通过环境变量 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 |