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").
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").
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 307037
Url: https://administrator.de/contentid/307037
Ausgedruckt am: 25.11.2024 um 05:11 Uhr
11 Kommentare
Neuester Kommentar
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
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
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
http://www.codeproject.com/Articles/3839/SendTo-mail-recipient
Auf die schnelle... (gerade wenig Zeit)
Registry-Eintrag: (Pfad zum Skript anpassen)
Skript:
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
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
Grüße Uwe
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.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?
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
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
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 Aber das geht jetzt etwas weit. Wer das möchte wende sich bitte per PN an mich