an34mem
Goto Top

Powershell - Image aus Datenstream generieren

Ich möchte eine Datei in mehreren KB / MB teilen.

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.

Content-ID: 664954

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

Ausgedruckt am: 19.12.2024 um 15:12 Uhr

147669
147669 22.03.2021 aktualisiert um 10:58:10 Uhr
Goto Top
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 face-wink.
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= ...

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++
}
Gruß SK
AN34Mem
AN34Mem 22.03.2021 um 14:01:31 Uhr
Goto Top
Danke SchmitzKatz für deine Hilfestellung.
Das "StreamReader" für Textdateien bestimmt ist hatte ich gelesen. Daher auch die Anmerkung zu "System.Drawing.Image FromStream (System.IO.Stream stream)", und Bitmap.FromStream(stream).

Aber davon abgesehen, ist mir leider bei meiner Fragestellung ein fataler Fehler unterlaufen. Sorry! Sorry! Sorry!
Es geht hierbei nicht um das reine teilen der Datei in KB / MB, vielmehr wird nach einen Lösungsweg gesucht um Schrittweise das Bild neu zu erstellen / teilen (Ich weiß: Ganz andere Sachlage):

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

Die Bilder müssen natürlich aufrufbar / darstellbar sein, was bei den Lösungsvorschlag (reines teilen) nicht möglich ist.
Daher ist meine Vermutung, dass "System.Drawing.Image FromStream (System.IO.Stream stream)", und "Bitmap.FromStream(stream)"
vielleicht dieses ermöglichen. Jedoch reichen einfach meine PS Kenntnisse dafür nicht aus, um das entsprechend umzusetzen.

Falls jemand einen Lösungsvorschlag dafür hat, würde ich mich sehr freuen (ggf. auch andere im Forum die daran Interesse haben).

Gruß
(An alle)
147669
147669 22.03.2021 aktualisiert um 14:28:16 Uhr
Goto Top
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 anpassen

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 ...
TK1987
TK1987 22.03.2021 aktualisiert um 14:26:56 Uhr
Goto Top
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:
$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  
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
AN34Mem
AN34Mem 22.03.2021 um 14:48:13 Uhr
Goto Top
Nein, ich meine nicht einfaches Skalieren.
Das ImageMagick die Möglichkeit mit "convert" bietet ist mir bekannt.

Jedoch suche ich eine Lösung für PS - Unter Berücksichtigung KB / MB.

Vergleichbar u.a. mit:
Responsive breakpoints