Powershell - Image aus Datenstream generieren
Ich möchte eine Datei in mehreren KB / MB teilen.
Beispiel:
Das Problem besteht hierbei das zwar die Datei geteilt wird, aber bei Images nicht
funktioniert (System.IO.StreamReader).
System.Drawing.Image FromStream (System.IO.Stream stream) habe ich zwar gefunden,
und Bitmap.FromStream(stream), aber auch mehrere Versuche dieses hinzuzufügen / ändern haben
kein Erfolg gebracht.
Wie bitte muss das richtig deklariert werden?
Danke für eure Hilfe.
Beispiel:
$teile = 50kb #Datei zu je 50KB teilen
$erweiterung = "jpg"
$hinzufuegen = "Neu_"
$einlesen = new-object System.IO.StreamReader("c:\tmp\test.jpg")
$zaehler = 1
$dateiname = "{0}{1}.{2}" -f ($hinzufuegen, $zaehler, $erweiterung)
while(($groesse = $einlesen.ReadLine()) -ne $null)
{
Add-Content -path $dateiname -value $groesse
if((Get-ChildItem -path $dateiname).Length -ge $teile)
{
++$zaehler
$dateiname = "{0}{1}.{2}" -f ($hinzufuegen, $zaehler, $erweiterung)
}
}
$einlesen.Close()
Das Problem besteht hierbei das zwar die Datei geteilt wird, aber bei Images nicht
funktioniert (System.IO.StreamReader).
System.Drawing.Image FromStream (System.IO.Stream stream) habe ich zwar gefunden,
und Bitmap.FromStream(stream), aber auch mehrere Versuche dieses hinzuzufügen / ändern haben
kein Erfolg gebracht.
Wie bitte muss das richtig deklariert werden?
Danke für eure Hilfe.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 664954
Url: https://administrator.de/contentid/664954
Ausgedruckt am: 19.11.2024 um 05:11 Uhr
5 Kommentare
Neuester Kommentar
Naja du hättest einfach mal nur in die Doku schauen müssen, dann hättest du lesen können das ein StreamReader für Textdateien gedacht ist und nicht für Bilder, die haben ja auch keine "Zeilenumbrüche" die mit ReadLine() auslesen werden könnten .
Für Dateien jeglicher Art arbeitet man mit einen ganz normalem FileStream auf Basis von Byte.
So teilt man ein JPG bspw. in gleich große Teile einer bestimmten Größe:
Gruß SK
Hinweise
StreamReader wurde für Zeichen Eingaben in einer bestimmten Codierung entwickelt, während die Stream -Klasse für die Eingabe und > Ausgabe von Byte konzipiert ist. Verwenden Sie StreamReader zum Lesen von Informations Zeilen aus einer Standard Textdatei.
https://docs.microsoft.com/de-de/dotnet/api/system.io.streamreader?view= ...StreamReader wurde für Zeichen Eingaben in einer bestimmten Codierung entwickelt, während die Stream -Klasse für die Eingabe und > Ausgabe von Byte konzipiert ist. Verwenden Sie StreamReader zum Lesen von Informations Zeilen aus einer Standard Textdatei.
Für Dateien jeglicher Art arbeitet man mit einen ganz normalem FileStream auf Basis von Byte.
So teilt man ein JPG bspw. in gleich große Teile einer bestimmten Größe:
$eingabe = 'C:\tmp\test.jpg'
$ausgabe = 'C:\tmp'
$size = 50kb
$fs = [IO.File]::OpenRead($eingabe)
$cnt = 1
while($fs.Position -lt $fs.Length){
$b = New-Object 'byte' $size
$c = $fs.Read($b,0,$size)
if ($c -ne $size){$b = $b[0..$c]}
[IO.File]::WriteAllBytes("$ausgabe\Part_$cnt",$b)
$cnt++
}
Zitat von @AN34Mem:
Beispiel: 5/20
1. 1000px x 200px ~100KB (Original)
2. 800px x 160px ~80KB
3. 640px x 128px ~60KB
4. 512px x 102px ~40KB
5. 410px x 82px ~20KB
?? Ich denke mal du meinst nicht einfach Skalieren des Bildes ? Denn das wäre ja einfach > Powershell: Bilder verkleinern oder an bestimmte Größe anpassenBeispiel: 5/20
1. 1000px x 200px ~100KB (Original)
2. 800px x 160px ~80KB
3. 640px x 128px ~60KB
4. 512px x 102px ~40KB
5. 410px x 82px ~20KB
Wenn du gültige Bilder aus einem Quellbild erstellen/aufteilen willst musst du über ein Graphics-Objekt gehen, einen Stream kannst du nicht linear für ein korrektes Bild auslesen
Also Bild in Bitmap laden , dann Graphics Object davon erstellen und dann die gewünschte Teil-Höhe und Breite in ein neues Bitmap schreiben.
https://docs.microsoft.com/de-de/dotnet/api/system.drawing.graphics.from ...
Moin,
falls Drittanbieter-Software für dich infrage kommt, würde ich dir zu ImageMagick raten.
Gut dokumentiert, einfach in der Handhabung und bringt in Sachen Bildbearbeitung alles mit, was das Herz begehrt.
Beispiel:
Das Bild wird hierbei soweit runterskaliert, bis es sowohl in der Breite, als auch in der Höhe passt - die Proportionen bleiben erhalten.
Gruß Thomas
falls Drittanbieter-Software für dich infrage kommt, würde ich dir zu ImageMagick raten.
Gut dokumentiert, einfach in der Handhabung und bringt in Sachen Bildbearbeitung alles mit, was das Herz begehrt.
Beispiel:
$Source = 'C:\Test\Image.Tif'
$Output = 'C:\Test\Image_Neu.Tif'
# Ausgabegröße
$width = 800
$heigth = 160
# Bildinformationen auslesen
magick identify $Source
# Bild skalieren
magick convert $Source -resize "${width}x${height}" $Output
Gruß Thomas