Jump to content

EMF Datei in z.B. JPG umwandeln


Direkt zur Lösung Gelöst von BOfH_666,
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Hallo zusammen!

Bin Lehrer für CNC-Technik und habe leider von Powershell etc. leider keine bis fast keine Ahnung. Trotzdem bin ich auf der Suche nach einem Script, welches mir emf-Dateien (Anzahl X) in z.B. jpg umwandelt (wenn die Transparenz der Bilddatei verloren geht ist das egal). Die Traumvorstellung zusätzlich wäre, dass dann diese jpg-Datei automatisch um 180 Grad gedreht wird und mit einer Erweiterung des Dateinamens (z.B. (180)) im selben Ordner abgespeichert wird. Geht so etwas grundsätzlich oder muss ich mich hier anders helfen?

Link zu diesem Kommentar

Das geht mit purem PowerShell eher nicht so einfach. Du könntest aber externe Tools wie z.B. ImageMagic mit einbinden und diese über die Kommandozeile mit den Bildern und zugehörigen Parametern füttern.

 

Für Deinen Einsatz-Zweck deutlich besser geeignet wäre vermutlich IrfanView. Das hat einen Batch-Modus bei dem Du die gleichen Arbeits- und Umwandlungs-Schritte auf einen ganzen Schwung an Bild-Dateien anwenden kannst. Schau es Dir doch mal an. 

Link zu diesem Kommentar

Guten Abend! Vielen Dank für den Tipp! Werde ich mir anschauen. Bin allerdings im Netz noch auf nachfolgenden Code gestoßen... Kann mir jemand sagen, wie ich wo den Pfad des Ordners angeben kann, in dem die EMF-Dateien gespeichert sind? So wie ich den Code interpretiere, kann dieser genau das, was ich benötige: Und zwar EMF-Dateien in Jpeg umwandeln...

enum ImageFormat { MemoryBMP; Bmp ; Emf; Wmf; Jpeg; Png; Gif; Tiff; Exif; PhotoCD; Icon }

function ConvertTo-Image {
    <#
.SYNOPSIS
Converts input to an image

.DESCRIPTION
Converts input file to an image. Supported output types: MemoryBMP, Bmp , Emf, Wmf, Jpeg, Png, Gif, Tiff, Exif, PhotoCD, Icon

.PARAMETER Files
Input files

.PARAMETER Format
Output Image format type

.EXAMPLE
Get-ChildItem C:\test -Filter "*.gif" | ConvertTo-Image -Format Png
Converts all gif animations from location 'C:\test' into png files

#>

    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $false, Position = 0, ValueFromPipeline = $true)]
        $Files,
        [ImageFormat]
        [Parameter(Mandatory = $true, Position = 1)]
        $Format
    )

    begin {
        Write-Verbose "Conversion start"
    }
    process {
        function Get-ImageFormat {
            param ($format)
            switch ($format) {
                "MemoryBMP" { [System.Drawing.Imaging.ImageFormat]::MemoryBMP }
                "Bmp" { [System.Drawing.Imaging.ImageFormat]::Bmp }
                "Emf" { [System.Drawing.Imaging.ImageFormat]::Emf }
                "Wmf" { [System.Drawing.Imaging.ImageFormat]::Wmf }
                "Jpeg" { [System.Drawing.Imaging.ImageFormat]::Jpeg }
                "Png" { [System.Drawing.Imaging.ImageFormat]::Png }
                "Gif" { [System.Drawing.Imaging.ImageFormat]::Gif }
                "Tiff" { [System.Drawing.Imaging.ImageFormat]::Tiff }
                "Exif" { [System.Drawing.Imaging.ImageFormat]::Exif }
                "Icon" { [System.Drawing.Imaging.ImageFormat]::Icon }
                Default { }
            }
        }

        $formatType = Get-ImageFormat $Format
        $fullName = $input.FullName
        $image = [System.Drawing.Image]::FromFile($fullName);
        $filePath = [IO.Path]::ChangeExtension($fullName, ".$($formatType.ToString().ToLower())");
        $image.Save($filePath, $formatType);
        $image.Dispose();
    }
    end {
        Write-Verbose "Conversion done"
    }
}

 

Link zu diesem Kommentar
vor 41 Minuten schrieb wethlo:

Kann mir jemand sagen, wie ich wo den Pfad des Ordners angeben kann, in dem die EMF-Dateien gespeichert sind?

 

Hast Du's mal mit dem Beispiel versucht, was in der enthaltenen Hilfe-Sektion gezeigt wird? ;-)   Im Zweifel hättest Du den Autor des Codes befragen können .... ;-) 

 

Mit dieser Methode hast Du übrigens keine Möglichkeit, die Umwandlung irgendwie noch irgendwie zu beeinflussen. Bei IrfanView könntest Du noch an vielen kleinen Schräubchen drehen falls nötig.

 

 

Link zu diesem Kommentar

Ja hab es versucht... Leider kommt folgende Antwort:

Der Typ [ImageFormat] wurde nicht gefunden.
In C:\Users\wethlo_\Desktop\umwandeln.ps1:6 Zeichen:5
+     [ImageFormat]
+     ~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (ImageFormat:TypeName) [], RuntimeException
    + FullyQualifiedErrorId : TypeNotFound

 

Der Code sieht nun so aus:

 

function ConvertTo-Image {
  [CmdletBinding()]
  param(
    [Parameter(Mandatory = $false, Position = 0, ValueFromPipeline = $true)]
    $Files,
    [ImageFormat]
    [Parameter(Mandatory = $true, Position = 1)]
    $Format
  )

  begin {
    Write-Verbose "Conversion start"
  }
  process {
    function Get-ImageFormat {
      param ($format)
      switch ($format) {
        "MemoryBMP" { [System.Drawing.Imaging.ImageFormat]::MemoryBMP }
        "Bmp" { [System.Drawing.Imaging.ImageFormat]::Bmp }
        "Emf" { [System.Drawing.Imaging.ImageFormat]::Emf }
        "Wmf" { [System.Drawing.Imaging.ImageFormat]::Wmf }
        "Jpeg" { [System.Drawing.Imaging.ImageFormat]::Jpeg }
        "Png" { [System.Drawing.Imaging.ImageFormat]::Png }
        "Gif" { [System.Drawing.Imaging.ImageFormat]::Gif }
        "Tiff" { [System.Drawing.Imaging.ImageFormat]::Tiff }
        "Exif" { [System.Drawing.Imaging.ImageFormat]::Exif }
        "Icon" { [System.Drawing.Imaging.ImageFormat]::Icon }
        Default { }
      }
    }

    $formatType = Get-ImageFormat $Format
    $fullName = $input.FullName
    $image = [System.Drawing.Image]::FromFile($fullName);
    $filePath = [IO.Path]::ChangeExtension($fullName, ".$($formatType.ToString().ToLower())");
    $image.Save($filePath, $formatType);
    $image.Dispose();
  }
  end {
    Write-Verbose "Conversion done"
  }
}

$ordner = "C:\Users\wethlo_\Desktop\Test"
Get-ChildItem -Path $ordner -Filter "*.emf" | ConvertTo-Image -Format Jpeg

 

bearbeitet von wethlo
Link zu diesem Kommentar
vor 15 Minuten schrieb wethlo:

Der Typ [ImageFormat] wurde nicht gefunden.

Du musst den Enum aus der Beispieldatei ganz oben drin lassen.

 

vor 44 Minuten schrieb BOfH_666:

Mit dieser Methode hast Du übrigens keine Möglichkeit, die Umwandlung irgendwie noch irgendwie zu beeinflussen.

Ganz wichtiger Punkt. Ich sehe nicht, wie man ohne zusätzliche Optionen ein Vektorformat wie EMF in ein Rasterformat wie JPG umwandeln können will.

Link zu diesem Kommentar

Wie in meiner ersten Frage schon erläutert ist das Bildformat EMF für die Software von unserem Etikettendrucker nicht verwendbar. Ich habe die Software nun soweit optimiert, dass ich die zweite Datei mit der Erweiterung (180) nicht mehr benötige, da ein Bild im BMP-Format um 180° gedreht werden kann. Was allerdings notwendig ist, wäre das Konvertieren von mehreren EMF-Files in das zu favorisierende BMP-Format... Der Dateiname kann/soll gleich bleiben.

Link zu diesem Kommentar

Moin,

 

vor einer Stunde schrieb wethlo:

Wie in meiner ersten Frage schon erläutert ist das Bildformat EMF für die Software von unserem Etikettendrucker nicht verwendbar.

nein, das hast du nicht erwähnt. :rolleyes: Also geht es darum, so etwas regelmäßig zu machen? Um welche Anzahlen geht es dabei (Größenordnung)? Und wie Olaf schon fragt: Muss das automatisiert werden? Wenn ja, wie weit - ist das Umwandeln Teil eines größeren Ablaufs?

 

Wenn wir dir sowas nicht einzeln rauskitzeln müssen, können wir vermutlich bessere Hinweise geben.

 

Gruß, Nils

PS. Olafs Hinweis auf IrfanView ist schon deshalb gut, weil man das auch per Kommandozeile steuern, also automatisieren kann.

bearbeitet von NilsK
Link zu diesem Kommentar

Ich versuche es mal in kurze Worte zu fassen für was ich das benötige: Wir exportieren aus unserer CAD-Software fertige CNC-Programme. Zusätzlich wird automatisch von jedem zu exportierenden Teil ein EMF-Bild in den selben Ordner mit selbem Namen gespeichert. Dieses EMF-Bild benötige ich für die im Nachgang erstellten Nesting-Programme. Hier werden viele Einzelteile aus einer kompletten Platte herausgenestet. Jedes Teil bekommt ein Label. Auf dieses Label kommt das besagte Bild. Allerdings geht dies nicht im EMF-Format sondern vorzugsweise im BMP-Format. Mit nachfolgendem Skript wird zusätzlich noch ein Makro in einer Excel-Datei ausgelöst (der Einfachheit halber wird nach der aktuellsten Excel-Datei in einem Verzeichnis gesucht), welches mir eine CSV-Datei exportiert, welche ich für den selben Prozess benötige. Diesem Script sollte nun das Konvertieren der EMF-Files (können 1 bis unendlich viele sein) in BMP-Files hinzugefügt werden. Die EMF-Dateien sind dann auch im selben Verzeichnis wie die Excel-Datei. Habe mir IrfanView heruntergeladen und mal manuell versucht, die Einzelbilder umzuwandeln, was sehr gut funktioniert hat. Habe allerdings die Einstellung auf Schwarz/Weiß gestellt, damit die Dateigröße nicht exorbitant groß wird. Der Etikettendrucker kann sowieso nur S/W. Könnte man dem Skript das Umwandeln hinzufügen oder ist das utopisch?

 

Da ich Schreinermeister und Lehrer für CAD/CNC-Technik bin, habe ich hiervon leider nicht viel bis keine Ahnung und dachte, dass mir hier jemand helfen könnte. Der ganze Prozess bildet im Prinzip einen kompletten digitalen Workflow einer modernen Schreinerei ab.

 

Anbei das bisher funktionierende Script, welches das Makro in der aktuellsten Excel-Datei aus dem Verzeichnis auslöst:

$Excel = New-Object -Comobject Excel.Application 
$Excel.Visible = $true

$Dir = "C:\CADLINE\_Einzelteile"
$Filepath = ((gci $Dir -recurse | where name -like "*xlsm" | sort LastWriteTime -Descending)[0]).FullName



$Workbook = $Excel.Workbooks.Open($Filepath)

$Excel.Run("MCStudioExport")

$Excel.ActiveWorkbook.Save()
 
$Workbook.Close()

$excel.Quit()

[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()

[System.Runtime.Interopservices.Marshal]::ReleaseComObject($workBook)
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel)

Remove-Variable -Name excel

 

Link zu diesem Kommentar

Etiketten-Drucken klingt wie eine Aufgabe, die wenigstens teilweise manuell ausgeführt wird. Also wäre vielleicht ein weiterer kleiner manueller Schritt kein allzu großer Bruch in Deinem Prozess. Du könntest ja schließlich mit dem Batch-Modus von IrfanView alle *.emf-Dateien in einem Rutsch in *.bmp-Dateien umwandeln

 

vor einer Stunde schrieb wethlo:

Habe mir IrfanView heruntergeladen und mal manuell versucht, die Einzelbilder umzuwandeln, was sehr gut funktioniert hat. Habe allerdings die Einstellung auf Schwarz/Weiß gestellt, damit die Dateigröße nicht exorbitant groß wird. Der Etikettendrucker kann sowieso nur S/W. Könnte man dem Skript das Umwandeln hinzufügen oder ist das utopisch?

 

Um's kurz zu machen ... ja - kann man.  :thumb1:

 

Da Du ja den Pfad der Excel-Datei bereits ermittelt hast und, wenn ich das richtig verstanden habe, die *.emf-Dateien im gleichen Ordner liegen, müsstest Du mit folgendem Schnipsel im Idealfall alle enthaltenen *.emf-Dateien umwandeln können.

i_view64.exe "$($FilePath.Directory.FullName)\*.emf" /convert="$($FilePath.Directory.FullName)\*.bmp"

Eventuell musst Du noch den vollen Pfad zu IrfnaView angeben und Du kannst natülich auch einen anderen Ausgabepfad für die *.bmp-Dateien angeben. Sollten für die Umwandlung noch weitere Kommandozeilenargumente nötig sein, musst Du Dir die aus der IrfanView-Hilfe suchen.

bearbeitet von BOfH_666
Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...