Board logo

标题: [文件操作] 求exiftool程序的下载 [打印本页]

作者: wh123wh123    时间: 2024-4-20 18:05     标题: 求exiftool程序的下载

求exiftool.exe程序的下载
作者: hfxiang    时间: 2024-4-20 18:55

回复 1# wh123wh123
http://bcn.bathome.net/s/tool/index.html?key=exiftool
作者: wh123wh123    时间: 2024-4-20 20:33

回复 2# hfxiang


微信公众号下载的jpg文件,有一些在windows照片查看器中无法打开,其原因是内嵌了ICC文件。解决办法很简单,不需要改windows颜色配置的方法:
首先,去http://exiftool.org下载个免费的命令行程序exiftool.exe
建一个批处理文件Remove-icc.bat,用记事本编辑输入:exiftool -icc_profile= *.jpg 。
将exiftool.exe和Remove-icc.bat都放在需要更改的微信图片目录下,运行Remove-icc.bat,目录里面原jpg内嵌的icc文件都会被去除,并生成一个新的同名jpg。原jpg会自动更名为jpg_original文件,没有内嵌icc的jpg完全不影响。
按类型排序,删掉所有jpg_original文件,搞定收工。


上面这个情况,按照上面的方法为什么无效?
作者: Batcher    时间: 2024-4-21 09:05

回复 3# wh123wh123


    请选一个“微信公众号下载的jpg文件,在windows照片查看器中无法打开”这样的图片上传到网盘,以便大家测试。
作者: wh123wh123    时间: 2024-4-21 16:27

本帖最后由 wh123wh123 于 2024-4-21 16:30 编辑

回复 4# Batcher


把图片右键保存到电脑,然后点击图片看能不能直接打开显示?看是什么原因导致无法正常显示的,期待原因和最佳解决办法
作者: 77七    时间: 2024-4-21 18:23

回复 5# wh123wh123


  
  1. https://exiftool.org/exiftool-12.83.zip
复制代码
用这个
作者: Five66    时间: 2024-4-21 18:24

就是icc , 原本打不开的 , 填充icc信息就能打开了
请确保你确实是移除了icc (3楼那)


作者: buyiyang    时间: 2024-4-21 20:25

回复 3# wh123wh123

RemoveICCfromJPG.ps1
  1. Add-Type -AssemblyName System.Drawing
  2. $cp = New-Object CodeDom.Compiler.CompilerParameters
  3. $cp.ReferencedAssemblies.Add([Reflection.Assembly]::GetAssembly([Drawing.Image]).Location) >$null
  4. $cp.CompilerOptions ='/unsafe'
  5. Add-Type -CompilerParameters $cp -TypeDefinition @"
  6. using System;
  7. using System.Drawing;
  8. using System.Drawing.Imaging;
  9. using System.IO;
  10. public class ImageProcessor
  11. {
  12.     public static void RemoveICCProfile(string imagePath)
  13.     {
  14.         string tempPath = Path.GetTempFileName();
  15.         using (Image image = Image.FromFile(imagePath))
  16.         {
  17.             if (image.PropertyItems.Length > 0)
  18.             {
  19.                 foreach (PropertyItem propertyItem in image.PropertyItems)
  20.                 {
  21.                     if (propertyItem.Id == 0x8773)
  22.                     {
  23.                         image.RemovePropertyItem(propertyItem.Id);
  24.                     }
  25.                 }
  26.             }
  27.             image.Save(tempPath, ImageFormat.Jpeg);
  28.         }
  29.         File.Delete(imagePath);
  30.         File.Move(tempPath, imagePath);
  31.     }
  32. }
  33. "@
  34. dir *.jpg | ForEach-Object {
  35.     [ImageProcessor]::RemoveICCProfile($_.FullName)
  36. }
复制代码

作者: terse    时间: 2024-4-21 21:27

回复 8# buyiyang

Add-Type -AssemblyName System.Drawing
这个POWERSHELL直接就可以了吧
作者: wh123wh123    时间: 2024-4-21 21:39

回复 6# 77七


@echo off
exiftool -icc_profile= *.jpg
pause

    'exiftool' 不是内部或外部命令
或批处理文件。
请按任意键继续. . .
这是咋回事?
作者: 77七    时间: 2024-4-21 21:42

回复 10# wh123wh123


   
把exe文件复制出来或者写exe的完整路径
作者: wh123wh123    时间: 2024-4-21 21:44

回复 9# terse


    用BAT或者VBS能不能解决?上面代码看不懂
作者: wh123wh123    时间: 2024-4-21 21:47

回复 11# 77七


    哦,是需要修改文件名才行,.jpg_original这个文件是什么?可以删除吗?如何顺便让批处理删除掉?求个完整地批处理代码,期待老师
作者: buyiyang    时间: 2024-4-21 21:53

回复 9# terse


    ISE才可以
作者: 77七    时间: 2024-4-21 21:55

回复 13# wh123wh123


  
  1. @echo off
  2. cd /d "%~dp0"
  3. set "_exiftool=D:\exiftool-12.83\exiftool(-k).exe"
  4. "%_exiftool%" -icc_profile= *.jpg
  5. del "*jpg_original"
  6. pause
复制代码

作者: wh123wh123    时间: 2024-4-21 22:03

回复 15# 77七
图片里的最上面的无用内容和最下面的二维码用批处理能不能删除掉?
作者: wh123wh123    时间: 2024-4-21 22:20

回复 8# buyiyang


    图片里的最上面的无用内容和最下面的二维码用批处理能不能删除掉?
作者: buyiyang    时间: 2024-4-21 23:10

回复 17# wh123wh123


    whiteCoverJPG.ps1
  1. Add-Type -AssemblyName System.Drawing
  2. function Cover-Image {
  3.     param(
  4.         [string]$ImagePath,
  5.         [int]$TopCover,
  6.         [int]$BottomCover
  7.     )
  8.     $originalImage = [System.Drawing.Image]::FromFile($ImagePath)
  9.     $originalHeight = $originalImage.Height
  10.     $originalWidth = $originalImage.Width
  11.     $graphics = [System.Drawing.Graphics]::FromImage($originalImage)
  12.     $whiteBrush = New-Object System.Drawing.SolidBrush([System.Drawing.Color]::White)
  13.     $graphics.FillRectangle($whiteBrush, 0, 0, $originalWidth, $TopCover)
  14.     $graphics.FillRectangle($whiteBrush, 0, $originalHeight - $BottomCover, $originalWidth, $BottomCover)
  15.     $coveredImagePath = [System.IO.Path]::ChangeExtension($ImagePath, "covered.jpg")
  16.     $originalImage.Save($coveredImagePath, [System.Drawing.Imaging.ImageFormat]::Jpeg)
  17. }
  18. # 白色覆盖顶部100像素,底部150像素
  19. $topCover = 100
  20. $bottomCover = 150
  21. dir *.jpg | ForEach-Object {
  22.     Cover-Image -ImagePath $_.FullName -TopCover $topCover -BottomCover $bottomCover
  23.     }
复制代码

作者: wh123wh123    时间: 2024-4-21 23:39

回复  wh123wh123


    whiteCoverJPG.ps1
buyiyang 发表于 2024-4-21 23:10



这个代码怎么使用?
作者: terse    时间: 2024-4-22 00:26

本帖最后由 terse 于 2024-4-22 01:56 编辑

修改一下 换回ForEach
  1. <# :
  2. @echo off
  3. powershell -noprofile -NoLogo "iex (${%~f0} | out-string)"
  4. pause
  5. exit
  6. #>
  7. Add-Type -AssemblyName System.Drawing
  8. function Remove-ICCProfile($images) {
  9.     $images.ForEach{
  10.         $temp = [IO.Path]::GetTempFileName()
  11.         $image = [Drawing.Image]::FromFile($_)
  12.         try {
  13.              $icc = $image.propertyItems.Id.Where{$_ -eq 0x8773}
  14.              if($icc){
  15.                 $image.RemovePropertyItem(0x8773)
  16.                 $image.Save($temp, [Drawing.Imaging.ImageFormat]::Jpeg)
  17.                 $image.Dispose()
  18.                 [IO.File]::Delete($_)
  19.                 [IO.File]::Move($temp, $_)
  20.              }
  21.         }
  22.         finally{ $image.Dispose() }
  23.     }
  24. }
  25. $images = [IO.Directory]::EnumerateFiles($pwd.Path, '*.jpg')
  26. Remove-ICCProfile $images
复制代码

作者: Batcher    时间: 2024-4-22 07:30

回复 19# wh123wh123


参考:http://bbs.bathome.net/thread-31071-1-1.html
作者: wh123wh123    时间: 2024-4-22 11:16

回复 20# terse



    PowerShell 代码使用不太方便,能不能用BAT解决?包括删除图片右下角的二维码和页眉上方的无用内容?
作者: terse    时间: 2024-4-22 13:12

回复 22# wh123wh123
bat没有你所需的处理图像方法,这个也是bat运行POWERSHELL代码,保存为BAT文件,运行请前先备份
  1. <# :
  2. @echo off
  3. powershell -noprofile -NoLogo "iex (${%~f0} | out-string)"
  4. pause
  5. exit
  6. #>
  7. Add-Type -AssemblyName System.Drawing
  8. function Remove-ICCProfile() {
  9.     param(
  10.         [string[]]$Images,
  11.         [int]$top,
  12.         [int]$bot
  13.     )
  14.     $images.foreach{
  15.         $temp = [IO.Path]::GetTempFileName()
  16.         try {
  17.             $image = [Drawing.Image]::FromFile($_)
  18.             $icc = $image.PropertyItems | Where-Object { $_.Id -eq 0x8773 }
  19.             if($icc){
  20.                 #$image.RemovePropertyItem(0x8773)
  21.                 $newWidth = $image.Width
  22.                 $newHeight = $image.Height - $top - $bot
  23.                 $target = New-Object Drawing.Bitmap($newWidth, $newHeight)
  24.                 $graphics = [Drawing.Graphics]::FromImage($target)
  25.                 $cropRect = [Drawing.Rectangle]::FromLTRB(0, 100, $image.Width, $image.Height - $bot)
  26.                 $graphics.DrawImage($image, 0, 0, $cropRect, [Drawing.GraphicsUnit]::Pixel)
  27.                 $graphics.Dispose()
  28.                 $target.Save($temp, [Drawing.Imaging.ImageFormat]::Jpeg)
  29.                 $target.Dispose()
  30.                 $image.Dispose()
  31.                 [IO.File]::Delete($_)
  32.                 [IO.File]::Move($temp, $_)
  33.             }
  34.         }
  35.         catch {
  36.             if ($image -ne $null) { $image.Dispose() }
  37.             if ($target -ne $null) { $target.Dispose() }
  38.         }
  39.     }
  40. }
  41. $images = [IO.Directory]::EnumerateFiles($pwd.Path, '*.jpg')
  42. Remove-ICCProfile $images -top 100 -bot 150
复制代码

作者: wh123wh123    时间: 2024-4-22 13:32

回复 23# terse



    POWERSHELL是什么?也是一个exe程序?需要下载放到同一个文件夹?还是?
作者: wh123wh123    时间: 2024-4-22 13:49

回复 21# Batcher

安装POWERSHELL电脑会变慢,有没有其他处理办法?比如VBS
作者: czjt1234    时间: 2024-4-22 13:50

回复 24# wh123wh123


    win10 win11 自带 powershell.exe
作者: wh123wh123    时间: 2024-4-22 14:01

回复 26# czjt1234

WIN7,另外问问,用BAT能不能以图片处理的方法,
    用BAT如何把图片里指定位置的不需要的图案区域填充变成白色?下面是我手动去除下面的二维码和最上面无用的广告,bat能不能代替手工自动处理?
选中图片-右键编辑-点选中【颜色1】-点击【颜色选取器】为白色使【颜色1】变为白色-点击【矩形】-点击【“填充”为“纯色”】-鼠标移动到需要变白的区域即可变成白色,最后保存即可。
作者: wh123wh123    时间: 2024-4-22 14:27

回复 15# 77七

用BAT能不能以图片处理的方法,
    用BAT如何把图片里指定位置的不需要的图案区域填充变成白色?下面是我手动去除下面的二维码和最上面无用的广告,bat能不能代替手工自动处理?
选中图片-右键编辑-点选中【颜色1】-点击【颜色选取器】为白色使【颜色1】变为白色-点击【矩形】-点击【“填充”为“纯色”】-鼠标移动到需要变白的区域即可变成白色,最后保存即可。
作者: 77七    时间: 2024-4-22 14:36

回复 28# wh123wh123


   bat只有调用ffmpeg等工具才好处理,命令还需要网上找,我试着找了几个,存在一些问题。
作者: 77七    时间: 2024-4-22 15:00

回复 28# wh123wh123


  
  1. @echo off
  2. rem 下载 "https://imagemagick.org/archive/binaries/ImageMagick-7.1.1-31-portable-Q8-x64.zip"
  3. cd /d "%~dp0"
  4. set "_exiftool=D:\exiftool-12.83\exiftool(-k).exe"
  5. set "_magick=D:\magick.exe"
  6. "%_exiftool%" -icc_profile= *.jpg
  7. del "*jpg_original"
  8. rem 0,0,1200,100 xyxy 左上角及右下角坐标
  9. for %%a in (*.jpg) do (
  10. "%_magick%" "%%a" -fill white -draw "rectangle 0,0,1200,100 rectangle 0,1660,1280,1800" "copy_%%a"
  11. move "copy_%%a" "%%a"
  12. )
  13. pause
复制代码
ai找了个代码,我自己胡乱修改,同时去除两个区域,需要使用magick,使用前先备份,不合适自行调整下坐标。
作者: wh123wh123    时间: 2024-4-22 15:33

回复 30# 77七

magick没找到下载地方
作者: wh123wh123    时间: 2024-4-22 15:35

回复 30# 77七

https://imagemagick.org/archive/ ... portable-Q8-x64.zip这个程序太大 不方便使用,能不能用bat直接调用系统自带的画图工具进行处理
作者: Batcher    时间: 2024-4-22 15:49

回复 25# wh123wh123


方法1、抛弃Win7改用Win10或Win11
方法2、使用BAT调用第三方命令行工具(例如ImageMagick)
单纯依靠BAT本身是不行的,不必浪费这个时间。
作者: wh123wh123    时间: 2024-4-22 16:57

回复 30# 77七

感谢老师,成功能处理。是不是只安全处理 本bat文件与需要处理的图片在同一个目录下的所有图片,不得对其他路径的文件进行错误修改吧?
作者: wh123wh123    时间: 2024-4-22 17:12

回复 30# 77七


    中间的那一行大红色字体能不能去除掉?
作者: buyiyang    时间: 2024-4-22 18:30

回复 35# wh123wh123

removeRedWatermark.ps1
  1. Add-Type -AssemblyName System.Drawing
  2. function removeRedWatermark-Image {
  3.     param([string]$imagePath)
  4.     $image = [System.Drawing.Bitmap]::FromFile($imagePath)
  5.     $rect = New-Object System.Drawing.Rectangle(0, 0, $image.Width, $image.Height)
  6.     $bitmapData = $image.LockBits($rect, [System.Drawing.Imaging.ImageLockMode]::ReadWrite, $image.PixelFormat)
  7.     $ptr = $bitmapData.Scan0
  8.     $bytes = $bitmapData.Stride * $image.Height
  9.     $rgbValues = New-Object byte[] $bytes
  10.     [System.Runtime.InteropServices.Marshal]::Copy($ptr, $rgbValues, 0, $bytes)
  11.     for ($i = 0; $i -lt $rgbValues.Length; $i += 3) {
  12.         $b = $rgbValues[$i]
  13.         $g = $rgbValues[$i + 1]
  14.         $r = $rgbValues[$i + 2]
  15.         if ($r -gt $g -and $r -gt $b) {
  16.             $total = $r + $g + $b
  17.             if ($total -gt 400) {
  18.                 $rgbValues[$i] = 255
  19.                 $rgbValues[$i + 1] = 255
  20.                 $rgbValues[$i + 2] = 255
  21.             } else {
  22.                 $rgbValues[$i] = 0
  23.                 $rgbValues[$i + 1] = 0
  24.                 $rgbValues[$i + 2] = 0
  25.             }
  26.         }
  27.     }
  28.     [System.Runtime.InteropServices.Marshal]::Copy($rgbValues, 0, $ptr, $bytes)
  29.     $image.UnlockBits($bitmapData)
  30.     $newPath = [System.IO.Path]::GetDirectoryName($imagePath) + "\processed_" + [System.IO.Path]::GetFileName($imagePath)
  31.     $image.Save($newPath)
  32.     $image.Dispose()
  33. }
  34. $(dir *.jpg).foreach{
  35.     Write-Host "processing: $($_.Name)"
  36.     removeRedWatermark-Image $_.FullName
  37. }
复制代码

作者: wh123wh123    时间: 2024-4-22 18:40

回复 36# buyiyang

您用BAT行不行?我不会用这个代码
作者: 77七    时间: 2024-4-22 21:40

回复 34# wh123wh123


   支持子目录
  1. @echo off
  2. rem 下载 "https://imagemagick.org/archive/binaries/ImageMagick-7.1.1-31-portable-Q8-x64.zip"
  3. cd /d "%~dp0"
  4. set "_exiftool=D:\exiftool-12.83\exiftool(-k).exe"
  5. set "_magick=D:\magick.exe"
  6. "%_exiftool%" -q -overwrite_original -icc_profile= -r . *.jpg
  7. rem 0,0,1200,100 xyxy 左上角及右下角坐标
  8. for /r %%a in (*.jpg) do (
  9. "%_magick%" "%%a" -fill white -draw "rectangle 0,0,1200,100 rectangle 0,1660,1280,1800" "copy_%%~nxa"
  10. move "copy_%%~nxa" "%%a"
  11. )
  12. pause
复制代码

作者: terse    时间: 2024-4-22 21:42

回复 37# wh123wh123
win7不是带有powershell的吗
作者: 77七    时间: 2024-4-22 21:47

回复 35# wh123wh123


  
  1. @echo off
  2. cd /d "%~dp0"
  3. set "_magick=D:\magick.exe"
  4. for /r %%a in (*.jpg) do (
  5. "%_magick%" "%%a" -fuzz 50% -fill white -opaque "#f4908d" "copy_%%~nxa"
  6. move "copy_%%~nxa" "%%a"
  7. )
  8. pause
复制代码
由于今天免费ai限额了...只能写到这样...
作者: aloha20200628    时间: 2024-4-22 22:38

本帖最后由 aloha20200628 于 2024-4-22 22:50 编辑


根据老帖的vbs代码改写一个bat+jscript版本,存为test.bat运行,100%取用系统内置资源,楼主试试吧...
运行结果是将当前目录及其子目录中的*.jpg裁剪(顶裁100,底裁150)完毕,对应的新文件名为*.new.jpg
代码17-18行对应的顶部/底部裁剪量可被修改


  1. @set @v=1 //&(dir /b/s/a-d *.jpg|cscript /e:jscript "%~f0") &exit/b
  2. ////
  3. files=WSH.stdin.readall().split('\r\n');
  4. for (; files.slice(-1)==''; files.pop());
  5. img=WSH.CreateObject('WIA.ImageFile');
  6. ip=WSH.CreateObject('WIA.ImageProcess');
  7. for (var n=0,l=files.length; n<l; ++n) {
  8. var np=files[n].lastIndexOf('.');
  9. var outF=files[n].slice(0,np)+'.new'+files[n].slice(np);
  10. cutImage(files[n], outF);
  11. }
  12. WSH.quit();
  13. //
  14. function cutImage (inF, outF) {
  15. img.loadfile(inF);
  16. ip.filters.add(ip.filterinfos('Crop').filterid);
  17. ip.filters(1).properties('Top')=100;
  18. ip.filters(1).properties('Bottom')=150;
  19. img=ip.apply(img); img.savefile(outF);
  20. }
复制代码

作者: wh123wh123    时间: 2024-4-23 09:33

回复 40# 77七


    没反应和没效果,没有DOS窗口
作者: wh123wh123    时间: 2024-4-23 09:39

回复 38# 77七


    中间的那一行大红色字体能不能去除掉?
作者: wh123wh123    时间: 2024-4-23 09:43

回复 41# aloha20200628

代码为什么复制代码粘贴到记事本里变成一行了?如何让按原格式到记事本里?
作者: wh123wh123    时间: 2024-4-23 09:59

回复 41# aloha20200628


    不行,没效果
作者: Batcher    时间: 2024-4-23 10:44

回复 44# wh123wh123


你用哪种方式复制的代码?
1、直接点击右上角的COPY按钮
2、先用鼠标选中代码然后再Ctrl+C
作者: wh123wh123    时间: 2024-4-23 11:16

回复 46# Batcher


    感谢领导注意到这个问题,我用这2种方法粘贴到记事本里都是一行显示了,不知道是不是和电脑有关,以前用其他电脑可以自动按原格式行正常的显示,更换了一个华硕小块主板就有各种小问题。
作者: 77七    时间: 2024-4-23 11:35

回复 42# wh123wh123


   
把 50% 改为 50%%
作者: ygqiang    时间: 2024-4-23 11:35

本帖最后由 ygqiang 于 2024-4-23 11:36 编辑

41楼,执行正常
作者: wh123wh123    时间: 2024-4-23 11:44

回复 48# 77七

修改后可以处理了,但是文字内容变得不清晰啦
作者: 77七    时间: 2024-4-23 11:52

回复 50# wh123wh123


   50可自行调整下,我不会写magick命令,做不到powershell能达到的效果。
作者: wh123wh123    时间: 2024-4-23 12:02

回复 41# aloha20200628


    这个代码复制到bat里,运行bat后没反应,如何正确执行?
作者: wh123wh123    时间: 2024-4-23 12:07

回复 51# 77七

哦,非常感谢老师的帮助,点赞。
作者: wh123wh123    时间: 2024-4-23 12:12

回复 9# terse

感谢老师指点,我对这种代码非常头疼,一点也看不懂,最关键的是放到bat里运行没效果,呵呵,不知道如何用bat正确使用这段代码?
作者: aloha20200628    时间: 2024-4-23 13:47

本帖最后由 aloha20200628 于 2024-4-23 16:15 编辑


用以下bat+jscript代码成功删除了5楼右键存成的问题图片中的exif属性,即可直接用windows图片查看器打开浏览,其后用41楼代码剪裁就一气呵成了...
以下代码存为test.bat用法》
   test.bat "问题图片.jpg"
生成新文件名为 "问题图片.new.jpg"
  1. @set @v=1 //&(if "%~1" neq "" cscript /e:jscript "%~f0" "%~1") &exit/b
  2. ////
  3. v=WSH.arguments;
  4. np=v(0).lastIndexOf('.'); outF=v(0).slice(0,np)+'.new'+v(0).slice(np);
  5. img=WSH.CreateObject('WIA.ImageFile');
  6. ip=WSH.CreateObject('WIA.ImageProcess');
  7. img.loadfile(v(0));
  8. ip.filters.add(ip.filterinfos('Exif').filterid);
  9. ip.filters(1).properties('ID')=34675;
  10. ip.filters(1).properties('Remove')=true;
  11. img=ip.apply(img); img.savefile(outF);
  12. WSH.quit();
复制代码

作者: terse    时间: 2024-4-23 14:24

回复 54# wh123wh123
你系统带有POWERSHELL吗?不会是精简系统吧,在cmd你执行 powershell set-executionpolicy Unrestricted 试一下
作者: aloha20200628    时间: 2024-4-23 15:03

本帖最后由 aloha20200628 于 2024-4-23 16:22 编辑

回复 52# wh123wh123

55楼代码(已订正第1行)用于删除单个问题图片中的Exif属性使其“复活” 》
   复制为test.bat文件后放到被处理的图片(问题图片.jpg)目录中,运行  test.bat "问题图片.jpg"  之后应可看到对应的 "问题图片.new.jpg" 新文件被生成;
41楼代码用于批量剪裁图片顶边和底边 》
   复制为test.bat文件后放到被处理的图片(*.jpg)目录中,运行  test.bat  之后应可看到对应的 *.new.jpg 新文件被生成。

作者: wh123wh123    时间: 2024-4-23 18:16

回复 56# terse

运行后没啥提示
作者: wh123wh123    时间: 2024-4-23 18:17

回复 55# aloha20200628


    可以无损删除中间那个红色大字广告吗?
作者: wh123wh123    时间: 2024-4-23 18:21

回复 41# aloha20200628

运行了这个代码后,发现打开Word后显示区域变很小了,是不是和这个代码有关系呢?如何修改回原始默认那种?




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