Extracting "color representation" property in of an image

Tagged: 

This topic contains 10 replies, has 2 voices, and was last updated by Profile photo of Matt Bloomfield Matt Bloomfield 1 year, 8 months ago.

  • Author
    Posts
  • #31583
    Profile photo of Mohan Derebail
    Mohan Derebail
    Participant

    Hi Guys,

    I have two codes with me. I now want to merge this two codes together.

    Code:1 – This will give you the image metadata info in a excel sheet:


    Write-Host "Starting the script...Please wait untill the extraction is complete"

    Function Get-FileMetaData

    {

    Param([string[]]$folder)

    foreach($sFolder in $folder)

    {

    $a = 0

    $objShell = New-Object -ComObject Shell.Application

    $objFolder = $objShell.namespace($sFolder)

    foreach ($File in $objFolder.items())

    {

    $FileMetaData = New-Object PSOBJECT

    for ($a ; $a -le 266; $a++)

    {

    if($objFolder.getDetailsOf($File, $a))

    {
    $hash += @{$($objFolder.getDetailsOf($objFolder.items, $a)) = $($objFolder.getDetailsOf($File, $a) -replace([char]8206,"") -replace([char]8207,"") ) }

    $FileMetaData | Add-Member $hash

    $hash.clear()

    } #end if

    } #end for

    $a=0

    $FileMetaData

    } #end foreach $file

    } #end foreach $sfolder

    } #end Get-FileMetaData

    $picdata = Get-FileMetaData $Env:userprofile\Desktop\image |select name,'Item type',size, height,width,'horizontal resolution','vertical resolution','color depth', 'Bit depth','jpeg_colorspace'

    $picdata | Export-csv $Env:userprofile\Desktop\image\ImageData.csv

    ——————————————————–

    Code 2 – This will give the "colorspace" info of an image through a form. The user has to select each image individually to find this property:


    ###########################################################
    Add-Type -AssemblyName System.Windows.Forms
    Add-Type -AssemblyName System.Drawing

    # Main Form
    $mainForm = New-Object System.Windows.Forms.Form
    $mainForm.Font = "Comic Sans MS,8.25"
    $mainForm.Text = "ColorSpace Extraction"
    $mainForm.ForeColor = "White"
    $mainForm.BackColor = "DarkBlue"
    $mainForm.width = 400
    $mainForm.height = 480

    # Title Label
    $titleLabel = New-Object System.Windows.Forms.Label
    $titleLabel.Font = "Comic Sans MS,12"
    $titleLabel.ForeColor = "Yellow"
    $titleLabel.Location = "95,10"
    $titleLabel.Size = "300,30"
    $titleLabel.Text = "ColorSpace Extraction"
    $mainForm.Controls.Add($titleLabel)

    # Form Labels

    $colorSpaceLabel = New-Object System.Windows.Forms.Label
    $colorSpaceLabel.Font = "Comic Sans MS,8"
    $colorSpaceLabel.Location = "20,100"
    $colorSpaceLabel.Size = "120,15"
    $colorSpaceLabel.Text = "Color Space"
    $mainForm.Controls.Add($colorSpaceLabel)

    # Form TextBoxes

    $colorSpaceTextBox = New-Object System.Windows.Forms.TextBox
    $colorSpaceTextBox.Font = "Comic Sans MS,8"
    $colorSpaceTextBox.Location = "140,100"
    $colorSpaceTextBox.Size = "200,15"
    $mainForm.Controls.Add($colorSpaceTextBox)

    # SelectFile Button
    $imageFileNameButton = New-Object System.Windows.Forms.Button
    $imageFileNameButton.Font = "Comic Sans MS,8"
    $imageFileNameButton.Location = "30,212"
    $imageFileNameButton.Size = "75,23"
    $imageFileNameButton.ForeColor = "DarkBlue"
    $imageFileNameButton.BackColor = "White"
    $imageFileNameButton.Text = "Select File"
    $imageFileNameButton.add_Click({selectFile})
    $mainForm.Controls.Add($imageFileNameButton)

    # Exit Button
    $exitButton = New-Object System.Windows.Forms.Button
    $exitButton.Location = "270,212"
    $exitButton.Size = "75,23"
    $exitButton.ForeColor = "Red"
    $exitButton.BackColor = "White"
    $exitButton.Text = "Exit"
    $exitButton.add_Click({$mainForm.close()})
    $mainForm.Controls.Add($exitButton)

    function selectFile {
    $selectForm = New-Object System.Windows.Forms.OpenFileDialog
    $selectForm.Filter = "All Files (*.*)|*.*"
    $selectForm.InitialDirectory = ".\"
    $selectForm.Title = "Select a Image File to Process"
    $getKey = $selectForm.ShowDialog()
    If ($getKey -eq "OK") {
    $filename = $selectForm.FileName
    $photo = [System.Drawing.Image]::FromFile($filename)

    # Color Space
    $colorProperty = $photo.GetPropertyItem(40961)
    if ($colorProperty -ne $null){
    $colorSpace = [System.BitConverter]::ToUInt16($colorProperty.Value, 0)}
    if ($colorSpace -eq "1") {$colorSpace = "sRGB"}
    if ($colorSpace -eq "2") {$colorSpace = "Adobe RGB"}
    if ($colorSpace -eq "65535") {$colorSpace = "Uncalibrated"}
    $colorSpaceTextBox.Text = $colorSpace

    } # End $getkey If
    } # End SelectFile Function

    function MakeNumber {
    $first =$args[0].value[0] + 256 * $args[0].value[1] + 65536 * $args[0].value[2] + 16777216 * $args[0].value[3] ;
    $second=$args[0].value[4] + 256 * $args[0].value[5] + 65536 * $args[0].value[6] + 16777216 * $args[0].value[7] ;
    if ($first -gt 2147483648) {$first = $first - 4294967296} ;
    if ($second -gt 2147483648) {$second= $second - 4294967296} ;
    if ($second -eq 0) {$second= 1} ;
    if (($first –eq 1) -and ($second -ne 1)) {
    write-output ("1/" + $second)}
    else {
    write-output ($first / $second)}
    } # End Function MakeNumber

    [void] $mainForm.ShowDialog()

    ———————————————————

    This is what I wanna do:

    I want to merge the colorspace code into code 1 so that the result will be added into the excel. (without the form interface) Can some one help me on where I should I add the colorspace code in Code 1 to accomplish this?

  • #31586
    Profile photo of Mohan Derebail
    Mohan Derebail
    Participant

    Any help guys?

  • #31603
    Profile photo of Matt Bloomfield
    Matt Bloomfield
    Participant

    I think I've got it working. In Code 1, after the line

    $a=0
    

    Add the following:

    
    $fileName = "$($objFolder.Self.Path)\$($objFolder.getDetailsOf($File, 0))"
    
    $photo = [System.Drawing.Image]::FromFile($fileName)
    
    # Color Space
     try { 
        $colorProperty = $photo.GetPropertyItem(40961)
        if ($colorProperty -ne $null) {
            $colorSpace = [System.BitConverter]::ToUInt16($colorProperty.Value, 0)}
        if ($colorSpace -eq "1") {$colorSpace = "sRGB"}
        if ($colorSpace -eq "2") {$colorSpace = "Adobe RGB"}
        if ($colorSpace -eq "65535") {$colorSpace = "Uncalibrated"}
        $cs = @{'ColorSpace' = $colorSpace}
     } #end try
     
     catch {
        $cs = @{'ColorSpace' = 'Property Not Set'}
     } #end catch
      
    $FileMetadata | Add-Member $cs
    

    I had to add the try/catch because an exception was generated if the file did not have that property set. I would recommend additional error handling to skip files that are not images, these generated an out of memory exception when I tested the script.

  • #31610
    Profile photo of Mohan Derebail
    Mohan Derebail
    Participant

    HI There !

    This works perfectly fine when I run it through the PowerShell ISE..But when I convert this into exe i'm getting the error message as "Unable to find type [System.Drawing.Image]. Make sure that the assembly that contains this type is loaded"

    And the data in the excel sheet is "Property Not Set" for the colorspace.

    how to fix this?

  • #31611
    Profile photo of Mohan Derebail
    Mohan Derebail
    Participant

    Should this be added to the code?
    Add-Type -AssemblyName System.Drawing

  • #31645
    Profile photo of Mohan Derebail
    Mohan Derebail
    Participant

    Any help ?

  • #31650
    Profile photo of Matt Bloomfield
    Matt Bloomfield
    Participant

    What are you using to turn the PowerShell code into an exe?

  • #31657
    Profile photo of Mohan Derebail
    Mohan Derebail
    Participant

    ps1 to exe tool

  • #31664
    Profile photo of Matt Bloomfield
    Matt Bloomfield
    Participant

    I just tested it with PS2EXE from the TechNet Gallery and you're right, you will need to add

    Add-Type -AssemblyName System.Drawing 

    Place it at the top of the function declaration after

    Param([string[]]$folder)

    Also, a minor thing, in the please wait message 'untill' should only have one 'l' 🙂

  • #31699
    Profile photo of Mohan Derebail
    Mohan Derebail
    Participant

    yeah this works fine..but i'm getting "exception calling...out of memory" message in the cmd when i run the exe..is there any way to make this disappear?

  • #31705
    Profile photo of Matt Bloomfield
    Matt Bloomfield
    Participant

    From my testing that error was generated when the script attempts to process a file that is not an image. You will need to add code to skip files that are not supported. A list of supported images types can be found here:
    https://msdn.microsoft.com/en-us/library/at62haz6(v=vs.110).aspx

You must be logged in to reply to this topic.