# mit Batch jpg skalieren



## WarsheepGER (23. Mai 2019)

Hallo zusammen, ich bin auf der Suche nach nen Batch Skript um viele Bilder auf eine Bestimmte Größe zu Skalieren.
bei meiner suche habe ich das gefunden:

```
CD /D D:\Temp
for %%f in (*.jpg) do convert -sample 888x888 %%f D:\temp1/%%f
```

jetzt wollte ich den für mich anpassen wobei ich 2 Möglichkeiten ausprobiert habe


```
@echo off
for /f "delims=" %%X in ('dir /s /a /b *.jpg') do (if EXIST "%%~dpXFolder.jpg" (convert -sample 300x300 "%%~dpXFolder.jpg")
```


```
@echo off
for /f "delims=" %%X in ('dir /s /a /b *.jpg') do (if EXIST "%%~dpXFolder.jpg" (convert -sample 300x300 "%%~dpXFolder.jpg" "%%~dpXFolder.jpg"))
```

Die funktionieren beide nicht. 

Letzt endlich will ich meinen Vorhandenen und funktionierenden Code mit der Skalierung erweiter:

```
for /f "delims=" %%X in ('dir /s /a /b *.jpg') do (if EXIST "%%~dpXFolder.jpg" (attrib +H "%%~dpXFolder.jpg"))
```
Der Code durchsucht alle Unterordner nach .jpg und wenn ein Folder.jpg vorhanden ist wird es Versteckt und soll gleichzeitig auf 300x300 Pixel skaliert werden.


----------



## zerix (24. Mai 2019)

Hallo,

hast du denn ImageMagick installiert?

Viele Grüße
Sascha


----------



## WarsheepGER (24. Mai 2019)

Hallo,
Nein das ist mir später am Abend  auch aufgefallen das da was fehlt wusste aber nicht was, 
habe mittlerweile jedoch einen anderen weg gefunden.
der zwar funktioniert, jedoch eine kleine Macke hat.
Ich habe als erstes versucht das jpg einfach zu überschreiben (Nicht funktionierender Code), jedoch lässt er dies nicht zu da er die Datei nicht Finden kann weil er sie vorher löscht!, darum muss ich jetzt über jpg>png>jpg gehen , das png löscht er komischerweise nicht(Funktionierender Code.



Spoiler: Funktionierender Code





```
@echo off
for /f "delims=" %%X in ('dir /s /a /b *Folder.jpg') do (call scale.bat -source "%%~dpXFolder.jpg" -target "%%~dpXFolder.png") & (call scale.bat -source "%%~dpXFolder.png" -target "%%~dpXFolder.jpg") & (del "%%~dpXFolder.png" /s /q) & (attrib +H "%%~dpXFolder.jpg")
```






Spoiler: scale.bat





```
@if (@X)==(@Y) @end /* JScript comment
        @echo off       
        cscript //E:JScript //nologo "%~f0" %*
        ::pause
        exit /b %errorlevel%       
@if (@X)==(@Y) @end JScript comment */

//https://msdn.microsoft.com/en-us/library/windows/desktop/ms630819(v=vs.85).aspx

var imageFile = new ActiveXObject("WIA.ImageFile");
var imageProcess = new ActiveXObject("WIA.ImageProcess");
var fileSystem = new ActiveXObject("Scripting.FileSystemObject");
var ARGS=WScript.Arguments;

/******
Scale filter description:

Scales image to the specified Maximum Width and Maximum Height preserving
Aspect Ratio if necessary.


MaximumWidth        - Set the MaximumWidth property to the width (in pixels)
                      that you wish to scale the image to.
MaximumHeight       - Set the MaximumHeight property to the height (in pixels)
                      that you wish to scale the image to.
PreserveAspectRatio - Set the PreserveAspectRatio property to True
                      [the default] if you wish to maintain the current aspect
                      ration of the image, otherwise False and the image will
                      be stretched to the MaximumWidth and MaximumHeight
FrameIndex          - Set the FrameIndex property to the index of a frame if
                      you wish to modify a frame other than the ActiveFrame,
                      otherwise 0 [the default]
                      

******/

//defaults

var maxWidth=300;
var maxHeight=300;

var pRatio=false;
var frameIndex=0;

var source="";
var target="";

var force=true;

var height=0;
var width=0;

var percentage=false;

////////////////////////////
////                      //
/**/     var QUALITY=100; //
////                      //
////////////////////////////

function existsFile(path){
    if (fileSystem.FileExists(path))
        return true;
}

function existsFolder(path){
    if (fileSystem.FolderExists(path))
        return true;
}

function deleteFile(path){
    fileSystem.DeleteFile(path);
}

function loadImage(image,imageFile){
    try{
       image.LoadFile(imageFile);
    }catch(err){
       WScript.Echo("Probably "+imageFile+" is not a valid image file");
       WScript.Echo(err.message);
       WScript.Quit(30);
    }
    height=image.Height;
    width=image.Width;
}

function ID2Format(id){
    var ids={};
    ids["{B96B3CAB-0728-11D3-9D7B-0000F81EF32E}"]="BPM";
    ids["{B96B3CAF-0728-11D3-9D7B-0000F81EF32E}"]="PNG";
    ids["{B96B3CB0-0728-11D3-9D7B-0000F81EF32E}"]="GIF";
    ids["{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}"]="JPG";
    ids["{B96B3CB1-0728-11D3-9D7B-0000F81EF32E}"]="TIFF";
    
    return ids[id];
}

function format2ID(format){
    formats={};
    formats["BMP"]="{B96B3CAB-0728-11D3-9D7B-0000F81EF32E}";
    formats["PNG"]="{B96B3CAF-0728-11D3-9D7B-0000F81EF32E}";
    formats["GIF"]="{B96B3CB0-0728-11D3-9D7B-0000F81EF32E}";
    formats["JPG"]="{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}";
    formats["TIFF"]="{B96B3CB1-0728-11D3-9D7B-0000F81EF32E}";
    
    return formats[format];
}

function convert(image,format){
    var ic=imageProcess.Filters.Count;
    var filterFormat=format2ID(format);
    if(filterFormat==null){
        WScript.Echo("not supported target format "+format);
        WScript.Quit(90);
    }
    imageProcess.Filters.Add(imageProcess.FilterInfos("Convert").FilterID);
    imageProcess.Filters(ic+1).Properties("FormatID").Value = filterFormat;
    imageProcess.Filters(ic+1).Properties("Quality").Value = QUALITY;
}

function scale(){
    if(maxHeight<=0){
        WScript.Echo("MaximumHeight ("+maxHeight+") should be bigger than 0");
        WScript.Quit(80);
    }
    
    if(maxWidth<=0){
        WScript.Echo("MaximumHeight ("+maxWidth+") should be bigger than 0");
        WScript.Quit(81);
    }
    
    var ic=imageProcess.Filters.Count;
    //var filterFormat=format2ID(format);
    imageProcess.Filters.Add(imageProcess.FilterInfos("Scale").FilterID);
    
    imageProcess.Filters(ic+1).Properties("MaximumWidth").Value = maxWidth;
    imageProcess.Filters(ic+1).Properties("MaximumHeight").Value = maxHeight;
    //WScript.Echo(pRatio+"::"+maxWidth+"::"+maxHeight+">>"+width+"++"+height);
    imageProcess.Filters(ic+1).Properties("PreserveAspectRatio").Value = pRatio;
    imageProcess.Filters(ic+1).Properties("FrameIndex").Value = frameIndex;
}

function fromPerc(){
    maxWidth=Math.round((width*maxWidth)/100);
    maxHeight=Math.round((height*maxHeight)/100);
    if(maxHeight==0)
        maxHeight=1;
    if(maxWidth==0)
        maxWidth=1;
}


function printHelp(){

    WScript.Echo( WScript.ScriptName + " - resizes an image");
    WScript.Echo(" ");
    WScript.Echo(WScript.ScriptName + "-source source.file -target file.format [-max-height height] [-max-width width] [-percentage yes|no] [-keep-ratio yes|no] [-frame-index -0.5..1] ");
    WScript.Echo("-source  - the image that will flipped or rotated.");
    WScript.Echo("-target  - the file where the transformations will be saved in.If the file extension format is different than the source it will be converted to the pointed one.Supported formats are BMp,JPG,GIF,TIFF,PNG");
    WScript.Echo("-percentage  - whether the rescale will be calculated in pixels or in percentages.If yes percentages will be used.Default is no.");
    WScript.Echo("-force  - If yes and the target file already exists , it will be overwritten");
    WScript.Echo("-max-height - max height of the image");
    WScript.Echo("-max-width - max width of the image");
    WScript.Echo("-keep-ratio - if dimensions ratio will be preserved.Default is yes");
    WScript.Echo("-frame-index - Have no idea what this is used for , but it is pressented in the rotation filter capabilities.Images with this and without looks the same.Accepted values are from -0.5 to 1");
    
}

function parseArguments(){
    if (WScript.Arguments.Length<4 || ARGS.Item(1).toLowerCase() == "-help" ||  ARGS.Item(1).toLowerCase() == "-h" ) {
        printHelp();
        WScript.Quit(0);
   }
  
       if (WScript.Arguments.Length % 2 == 1 ) {
        WScript.Echo("Illegal arguments ");
        printHelp();
        WScript.Quit(1);
    }
    
    //ARGS
    for(var arg = 0 ; arg<ARGS.Length-1;arg=arg+2) {
        if (ARGS.Item(arg) == "-source") {
            source = ARGS.Item(arg +1);
        }
        if (ARGS.Item(arg) == "-target") {
            target = ARGS.Item(arg +1);
        }

        if (ARGS.Item(arg).toLowerCase() == "-force" && (ARGS.Item(arg +1).toLowerCase() == "yes" || ARGS.Item(arg +1).toLowerCase() == "true") ) {
            force=true;
        }
        
        if (ARGS.Item(arg).toLowerCase() == "-percentage" && (ARGS.Item(arg +1).toLowerCase() == "yes" || ARGS.Item(arg +1).toLowerCase() == "true") ) {
            percentage=true;
        }
        
        if (ARGS.Item(arg).toLowerCase() == "-keep-ratio" && (ARGS.Item(arg +1).toLowerCase() == "no" || ARGS.Item(arg +1).toLowerCase() == "false") ) {
            pRatio=false;
        }
        
        if (ARGS.Item(arg).toLowerCase() == "-max-width") {
            try {
                maxWidth=parseInt(ARGS.Item(arg +1));               
            } catch (err){
                WScript.Echo("Wrong argument:");
                WScript.Echo(err.message);
                WScript.Quit(10);
            }
            
        }
        
        if (ARGS.Item(arg).toLowerCase() == "-max-height") {
            try {
                maxHeight=parseInt(ARGS.Item(arg +1));               
            } catch (err){
                WScript.Echo("Wrong argument:");
                WScript.Echo(err.message);
                WScript.Quit(15);
            }
            
        }
        
        
        if (ARGS.Item(arg).toLowerCase() == "-frame-index") {
            try {
                frameIndex=parseFloat(ARGS.Item(arg +1));
                if(frameIndex<-0.5 || frameIndex > 1){
                    WScript.Echo("Wrong argument - frame index should be between -0.5 and 1");
                    WScript.Quit(25);
                }
                
            } catch (err){
                WScript.Echo("Wrong argument:");
                WScript.Echo(err.message);
                WScript.Quit(20);
            }           
        }       
    }
    
    if (target==""){
        WScript.Echo("Target file not passed");
        WScript.Quit(5);
    }
    
    if(source==""){
        WScript.Echo("Source file not passed");
        WScript.Quit(6);
    }
}

parseArguments();

if(!existsFile(source)){
    WScript.Echo("Source image: " + source +" does not exists");
    WScript.Quit(40);
}

if(existsFile(target) && !force){
    WScript.Echo("Target image: " + target +" already exists");
    WScript.Quit(45);
}

if(existsFolder(target)){
    WScript.Echo("There's existing folder with the target file  (" + target +") name");
    WScript.Quit(46);
}

if(existsFile(target) && force){
    deleteFile(target);
}

var targetFormat=target.split(".")[target.split(".").length-1].toUpperCase();
loadImage(imageFile,source);
var sourceFormat=ID2Format(imageFile.FormatID);


if(maxWidth==0 && !percentage){
    maxWidth=width;
}

if(maxHeight==0 && !percentage){
    maxHeight=height;
}

if(maxWidth==0 && percentage){
    maxWidth=100;
}

if(maxHeight==0 && percentage){
    maxHeight=100;
}


if(percentage){
    fromPerc();
}



///
scale();
///

if (sourceFormat !== targetFormat ){
    convert(resImg,targetFormat);
}

var resImg=imageProcess.Apply(imageFile);
resImg.SaveFile(target);
```







Spoiler: Nicht funktionierender Code





```
for /f "delims=" %%X in ('dir /s /a /b *Folder.jpg') do (call scale.bat -source "%%~dpXFolder.jpg" -target "%%~dpXFolder.jpg") & (attrib +H "%%~dpXFolder.jpg")
```
Die Fehlermeldung beim normalen Überschreiben

```
Probably C:\\1\Film 05\Folder.jpg is not a valid image file
Das System kann die angegebene Datei nicht finden.
```


----------



## WarsheepGER (29. Mai 2019)

Entschuldigt den Doppel post
Ich habe Herausgefunden warum es nicht so richtig funktioniert hat.
-target darf nicht den gleichen namen haben sondern nur welche Endung das Ergebnis haben soll.



Spoiler: Funktioniert





```
for /f "delims=" %%X in ('dir /s /a-h /b *Folder.jpg') do (call scale.bat -source "%%~dpXFolder.jpg" -target "jpg" ) & (attrib +H "%%~dpXFolder.jpg") & (echo "%%~dpXFolder.jpg")
del "jpg" /s /q
```




somit wird neben der bat Datei das Bild als jpg Datei zwischengespeichert bevor es im Richtigen Ordner skaliert gespeichert wird.
Dies hat als folge das zum Schluss eine jpg Datei neben der Batch zurückbleibt die aber einfach gelöscht werden kann.
das Echo ist nur zur Überprüfung wo das Script gerade ist.


----------



## HV-Engineer (14. September 2019)

Hallo.

ich weiß nicht ob Du nur etwas in Batch programmieren möchtest oder auch auf einen fertigen Bildbetrachter zurückgreifen möchtest, der solch eine Funktion hat.
Ich bin hier nicht so fit und verwende in der Regel, wenn es schnell gehen soll Irfanview 
das solch eine Option zum Nachbearbeiten von Bildern als Batch bearbeitung hat. Kann man als Download kostenfrei runterladen.
Starten unter 

Datei
        Batch (Stapel) Konvertierung / Umbenennungen

Vielleicht hilft es Dir, damit kann man große Mengen Bilder umbenennen und nummerieren, bearbeiten und auch die Qualität der jpegs reduzieren (falls Du mal etwas kleinere Dateien benötigst).
Gruss Norbert


----------

