derwowusste
Goto Top

Windows Explorer Bildkompression programmatisch ansprechen

Moin Kollegen!

Hat schon einmal jemand ein Kommando gefunden, um die in Windows eingebaute Bildkompression anzusprechen?
Ich meine die, die zum Einsatz kommt, wenn man per Kontextmenü Bilder zum Versand vorbereitet ("senden an: e-mail-Empfänger").

Content-ID: 307037

Url: https://administrator.de/contentid/307037

Ausgedruckt am: 25.11.2024 um 05:11 Uhr

colinardo
colinardo 13.06.2016 aktualisiert um 20:53:38 Uhr
Goto Top
Hi DWW,
das nicht aber ich habe das mal für Outlook mit einer COM-Bibliothek nachgebaut:
Outlook 2010 VBA für JPG Bilder komprimieren und Senden
Die kleine Bibliothek lässt sich auch aus anderen Anwendungen über die COM-Schnittstelle verwenden.

Und mittels Powershell und .NET kann man sich sowas auch leicht nachbauen, ebenfalls schon mal hier eine Funktion gepostet:
Powershell: Bilder verkleinern oder an bestimmte Größe anpassen

Grüße Uwe
colinardo
colinardo 13.06.2016 aktualisiert um 21:51:52 Uhr
Goto Top
Nachtrag: Das hier spricht die sendmail.dll über einen simulierten Drop an den im System registrierten Drophandler (mapimail) an, die für den Dialog und die Funktion zuständig ist:
http://www.codeproject.com/Articles/3839/SendTo-mail-recipient
DerWoWusste
DerWoWusste 13.06.2016 um 22:16:19 Uhr
Goto Top
Hi.

Sehr gut, das ist doch was! Die PS-Resultate sind vergleichbar mit denen, die Windows bietet.
Kannst Du einen Kontextmenüeintrag bauen, der das PS Script nutzt um die selektierten Elemente zu schrumpfen, sagen wir mal auf 1280x1024?
colinardo
Lösung colinardo 14.06.2016 aktualisiert um 09:23:55 Uhr
Goto Top
Auf die schnelle... (gerade wenig Zeit)

Registry-Eintrag: (Pfad zum Skript anpassen)
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell\ImageResizer]
@="Bilder verkleinern"  

[HKEY_CLASSES_ROOT\*\shell\ImageResizer\command]
@="\"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe\" -ExecutionPolicy ByPass -Noninteractive -NoProfile -File \"C:\\skripte\\resizer.ps1\" \"%1\""  

Skript:
param(
    [parameter(mandatory=$true)][string]$pImagePath
)
function Resize-Image{
    param(
        [parameter(mandatory=$true,ValueFromPipeline=$true)][alias("FullName")][string[]]$images,  
        [parameter(mandatory=$true)][string]$OutPath,
        [parameter(mandatory=$true)][int32]$NewWidth,
        [parameter(mandatory=$true)][int32]$NewHeight,
        [switch]$Passthru,
        [switch]$DownSizeOnly,
        [switch]$AppendSizeToFilename
    )
    begin{
        Add-Type -AssemblyName System.Drawing
        $resizedCollection = @()
    }
    process{
        $images | %{
            $ext = [System.IO.Path]::GetExtension($_)
            $basename = [System.IO.Path]::GetFileNameWithoutExtension($_)
            
            if ($ext -match "bmp$|jpe?g$|gif$|tiff?$|png$"){  
                Try{
                    $img = [System.Drawing.Bitmap]::FromFile($_)
                    $percentWidth = $newWidth / $img.Width
                    $percentHeight = $newHeight / $img.Height
                    if ($percentWidth -lt $percentHeight){$ratio = $percentWidth}else{$ratio = $percentHeight}
                    [int32]$nWidth = $img.Width * $ratio
                    [int32]$nHeight = $img.Height * $ratio
                    if ($DownSizeOnly.IsPresent -and $ratio -ge 1){
                        copy-item $_ $outPath
                        return
                    }
                    $newImg = new-Object System.Drawing.Bitmap($nWidth,$nHeight)
                    ([System.Drawing.Graphics]::FromImage($newImg)).DrawImage($img,0,0,$newImg.Width,$newImg.Height)
                    $newImagePath = ""  
                    if($AppendSizeToFilename.IsPresent){
                        $newImagePath = "$outPath\$($basename)_$($nWidth)x$($nHeight)$ext"  
                    }else{
                        $newImagePath = "$outPath\$basename$ext"  
                    }
                    if(!(test-Path $outPath)){md $outPath}
                    $newImg.Save($newImagePath,$img.RawFormat)
                    $resizedCollection += $newImagePath
                    # write-host "Resized Image '$_' to '$newImagePath'" -ForegroundColor Green 
                }catch{
                    Write-Error -Message $_.Exception.Message
                }
            }else{
                Write-Error -Message "Das Bild '$_' hat kein unterstütztes Format. Folgende Formate werden unterstützt: bmp|jpg|gif|tif|png"  
            }
        }
    }
    end{
        $img.Dispose()
        $newImg.Dispose()
        [System.GC]::Collect()
        if($passthru.IsPresent){return $resizedCollection}
    }
}

Resize-Image -images $pImagePath -OutPath ([System.IO.Path]::GetDirectoryName($pImagePath)) -NewWidth 1280 -NewHeight 1024 -AppendSizeToFilename
Aber warum das Rad neu erfinden :-.) gibt doch solche Tools wie Sand am Meer. Wenn dann würde ich mir da gleich eine EXE kompilieren, die wäre effektiver.

Grüße Uwe
DerWoWusste
DerWoWusste 14.06.2016 aktualisiert um 10:47:13 Uhr
Goto Top
Cool.

Ich stelle nur fest, dass das mit bis zu 15 Bildern funktioniert, wenn ich 16 oder mehr selektiere, ist der Kontextmenüeintrag nicht mehr zu sehen. Was kann das sein?

Aber warum das Rad neu erfinden
Weil alle Räder, die es gibt, irgendwie einen Platten zu haben scheinen. Z.B. Prish resizer: funktioniert einwandfrei, so lange, bis ich eine Custom Resolution wähle. Der fügt mir dann einen Kontextmenüeintrag hinzu für eben diese Auflösung. Wähle ich diesen dann, wird seltsamerweise der Heidi Eraser gestartet und fragt, ob ich die Bilder vernichten will (LOL!). Andere Resizer haben keine sonderlich gute Verkleinerung, wieder andere erfordern zuviel Geklicke. Da ist Deins schon weit vorne.

Edit: auf einem, weiteren Testrechner (alle Win10) kommt bei 16 oder mehr Bildern diese Warnung schon bei schlichtem Rechtsklick, also noch bevor die Kontextmenüauswahl erscheint:
clipboard01
colinardo
colinardo 14.06.2016 aktualisiert um 10:46:51 Uhr
Goto Top
Zitat von @DerWoWusste:
Ich stelle nur fest, dass das mit bis zu 15 Bildern funktioniert, wenn ich 16 oder mehr selektiere, ist der Kontextmenüeintrag nicht mehr zu sehen. Was kann das sein?
Ich glaub da scheinst du mal wieder einen neuen Bug in Windows 10 ausgegraben zu haben ...unter Windows 7 ist das jedenfalls nicht nachvollziehbar, unter W10 schon. Unausgereifter sch...dreck.
DerWoWusste
DerWoWusste 14.06.2016 um 10:49:33 Uhr
Goto Top
Du sagst es. Kompatibilität mit Programmen: traumhaft. Interna: grauenhaft.
DerWoWusste
DerWoWusste 14.06.2016 um 11:02:27 Uhr
Goto Top
Auch wenn schimpfen auf 10 Spaß macht: scheint ein Problem zu sein, dass Windows auch in Vorversionen schon hatte: http://answers.microsoft.com/en-us/windows/forum/windows_7-files/window ...
Lässt sich "lösen", indem man den Wert auf 16 (=unlimited) setzt, dann ist der Kontextmenüeintrag wieder da - nur funktioniert er leider nur noch eingeschränkt, nämlich genau für die Datei, aus der selektierten Menge, die man letztlich anklickt. Suuper.
kleinerbub
kleinerbub 14.06.2016 um 12:17:30 Uhr
Goto Top
Hi,

mein "Rad" heißt IrfanView und erledigt das per Batch (Drag'n'Drop) problemlos. Damit kann ich auch festlegen welche Größe und Qualität ich am Ende haben will und wohin und unter welchem Namen das Ergebnis gespeichert werden soll. Damit bin ich seit einiger Zeit ganz glücklich unterwegs.

just my two cents

Gruß kleinerbub
DerWoWusste
DerWoWusste 14.06.2016 um 12:34:44 Uhr
Goto Top
Keine Frage, es gibt 237 Wege nach Rom. Nur hatte ich noch keinen gefunden, der
1 problemlos per Kontextmenü und/oder Skript läuft
2 eine gute Kompression liefert.

Du kannst ja mal Deine Ergebnisse mit denen der windowseigenen (Kontextmenü: senden an Mailempfänger) vergleichen bezüglich Größe und Qualität. Wäre auf Deinen Bericht gespannt.
colinardo
colinardo 14.06.2016 aktualisiert um 12:38:49 Uhr
Goto Top
Zitat von @DerWoWusste:
2 eine gute Kompression liefert.
Das Skript verwendet ja noch nicht mal eine JPG Kompression sondern simples kopieren der Bildinhalte in eine reduzierte Größe, die Größe könnte man jetzt problemlos noch weiter reduzieren wenn ich den JPG Kompressionsfaktor erhöhe, das wäre Problemlos nachrüstbar face-wink Aber das geht jetzt etwas weit. Wer das möchte wende sich bitte per PN an mich face-smile