yashi
Goto Top

psp9 script mit python - datum

Hallo.

Ich bräuchte mal bisschen Hilfe mit der Formatierung eines Datums (stammt aus einer jpeg EXIF)
Da dieses Unterforum aber bis jetzt ungenutzt blieb, vermute ich mal, dass hier weder jemand lesen wird, noch Ideen für Lösungswege posten wird.
Naja versuchen kann man es ja trozdem.

Also falls jemand Ahnung hat:

Ich möchte den string:
2006:04:05 21:40:26
nach
05.04.06
konvertieren.
[Python script für Paint Shop Pro.]


mfg

Content-Key: 29822

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

Printed on: April 19, 2024 at 23:04 o'clock

Member: Dani
Dani Apr 05, 2006 at 19:55:30 (UTC)
Goto Top
G' Abend,
was hast du den genau vor. Ne Beschreibung wäre net schlecht -> sprich für was soll das gut sein. Darf es auch in anderen Sprache sein??

Schönen Abend...


Gruß
Dani
Member: yashi
yashi Apr 06, 2006 at 10:39:56 (UTC)
Goto Top
Juhu eine Antwort


Also falls du Paint Shop Pro 9 kennst - der lässt sich auch (zb bei Stapelverarbeitung) mit einem Python-Script steuern. Und eben so ein Script versuche ich für automatische Datumsstempel zu schreiben. Eine andere Sprache ist nicht möglich da
  1. PSP9 nur Python akzeptiert
  2. man sonst ein Prog schreiben müsste, welches Bildbearbeitung & Einfügen von Text ins Bild drauf hat

Bis jetzt erzeugt mein Script zwar 'nen Stempel, der aber leider genau so wie der Text in der EXIF-info der jpg aussieht. Also eben englisches Datum + Zeit. Wenn man den Text nun formatieren könnte, wär mein Script brauchbar:
2006:04:05 21:40:26
nach
05.04.06

Den String holt sich das Script also schon erfolgreich aus der EXIF (Metadaten einer jpg)
(Quellcode siehe ganz unten)
In der Zeile
CaptionDate = ImageInfo['ExifOriginalDate']  
wird der String in eine Variable geschrieben. Nun habe ich mir sowas in der Art wie
datestrn(ImageInfo['ExifOriginalDate'])
oder so vorgestellt. Keine Ahnung wie man eine Variable vom Typ "Datum" anlegt (hab mir ja auch nur alles aus anderen Quellcodes zusammen gesetzt
)
Eine einfache Formatierung des Strings wäre auch denkbar (zb nur die ersten 10 Zeichen)
Naja mein Problem müsste zu 100% mit Python lösbar sein.

Ich hoffe es war verständlich erklärt und ihr könnt helfen (müsste sonst ca 380 Fotos von Hand beschriften -.-)
mfg, yashi


EXIF-Datestamp.PspScript:
from JascApp import *
import string
import JascUtils

def ScriptProperties():
    return {
        'Author': u'Jasc Software, Zeromotion',  
        'Copyright': u'Copyright (c) 2002-2004 Jasc Software, Inc.  All rights reserved.',  
        'Description': u"EXIF-Datestamp unten rechts.",  
        'Host': u'Paint Shop Pro 9',  
        'Host Version': u'9.00',  
        }

NoEXIFData = u"Auf dem aktuell ausgewählten Bild wurden keine EXIF-Daten gefunden."  
CaptionFontName = u"Arial"  


def Do(Environment):

    if JascUtils.RequireADoc( Environment ) == App.Constants.Boolean.false:
        return

    
    # first extract the EXIF data - if we can't find any just return without changing the image 
    ImageInfo = App.Do( Environment, 'ReturnImageInfo', {'GeneralSettings': {'Version': ((9,0,0),1) }} )  
    if ImageInfo['ExifOriginalDate'] == '':  
        App.Do(Environment,  'MsgBox', {  
                'Buttons': App.Constants.MsgButtons.OK,   
                'Icon': App.Constants.MsgIcons.Stop,   
                'Text': NoEXIFData,  
                'GeneralSettings': {'Version': ((9,0,0),1) }  
                })
        return


    # save any existing selection
    SelSaver = JascUtils.SaveSelection( Environment, App.TargetDocument )
    
    CaptionDate = ImageInfo['ExifOriginalDate']  

    # Figure out how big the text should be by examining the overall image size.  We'll do a rough 
    # scale based on 1000 pixels.  We won't paint text less than 16 point in any event. 
    ImageMaxDimension = max(App.TargetDocument.Width, App.TargetDocument.Height)
    TextScaleFactor = max(0.25, float(ImageMaxDimension) / 800.0)
    TextSize = int(16.0 * TextScaleFactor)
 
    # now place the text - use right justification at the lower right corner of the image.
    # we are placing 16 pixel text, so to leave some room for leading we place the first
    # line of text 24 pixels up from the bottom
    TextPlacementLine1 = (App.TargetDocument.Width - 4 * TextScaleFactor, App.TargetDocument.Height - (24 * TextScaleFactor))
    App.Do( Environment, 'TextEx', {  
            'Visibility': True,   
            'CreateAs': App.Constants.CreateAs.Selection,   
            'Start': TextPlacementLine1,   
            'TextFlow': App.Constants.TextFlow.HorizontalDown,   
            'TextType': App.Constants.TextType.TextBase,   
            'AutoKern': True,   
            'Kerning': 0,   
            'Tracking': 0,   
            'Leading': 0,   
            'Font': CaptionFontName,   
            'PointSize': TextSize,   
            'Italic': False,   
            'Bold': False,   
            'Underline': False,   
            'Strikethru': False,   
            'AntialiasStyle': App.Constants.AntialiasEx.Smooth,   
            'WarpText': True,   
            'SetText': App.Constants.Justify.Right,   
            'Fill': None,   
            'Stroke': None,   
            'LineWidth': 0,   
            'Join': App.Constants.JointStyle.Miter,   
            'MiterLimit': 10,   
            'Characters': CaptionDate,   
            'Strings': None,   
            'TextTarget': (0,0,[1],False),   
            'PathTarget': None,   
            'GeneralSettings': {  
                'ExecutionMode': App.Constants.ExecutionMode.Default,   
                'AutoActionMode': App.Constants.AutoActionMode.Match,   
                'Version': ((9,0,0),1)  
                }
            })

    # Negativbild
    App.Do( Environment, 'NegativeImage', {  
            'GeneralSettings': {  
                'ExecutionMode': App.Constants.ExecutionMode.Default,   
                'AutoActionMode': App.Constants.AutoActionMode.Match,   
                'Version': ((9,0,0),1)  
                }
            })

    # restore the original selection
    SelSaver.RestoreSelection()
Member: yashi
yashi Apr 06, 2006 at 11:59:12 (UTC)
Goto Top
Hmm...

Hab beim Mittag nochmal drüber nachgedacht. Also wenn ich ne andere Sprache zur Verfügung hätte, würde es ja ganz einfach gehen. ZB. könnte man in eine Batch schreiben:
set "dtmstr=2006:04:05 21:40:26"  
set "dtmstr=%dtmstr:~2%"  
for /f "tokens=1-3 delims=: " %%a in ("%dtmstr%") do echo %%c.%%b.%%a  
und man bekommt "05.04.06" Aber wie gesagt - das Problem mit der Bildbearbeitung besteht ja. Um mein Anliegen nun einfacher zu formulieren:
Wenn jemand die paar Zeilen oben nach PYTHON übersetzen könnte, wäre mein Problem gelöst.


mfg
Member: yashi
yashi Apr 07, 2006 at 11:14:35 (UTC)
Goto Top
OK.
Ich habe es jetzt selber gelöst. Danke für eure Aufmerksamkeit. (das soll jetzt nich zynisch klingen oder so ^^)
Hab die Seite vom Python Projekt studiert und folgende Lösung entwickelt:
    CaptionDate = ImageInfo['ExifOriginalDate'].replace( ':', ' ' )  
    CaptionDate = CaptionDate[8:10] + '.' + CaptionDate[5:7] + '.' + CaptionDate[2:4]  

Geht bestimmt auch einfacher.
Member: simba
simba May 08, 2006 at 12:38:40 (UTC)
Goto Top
naja der Weg ist doch perfekt, einzig, dass du auf das replace verzichten kannst.


string  = "2006:04:05 21:40:26"  
date    = string[8:10] + '.' + string[5:7] + '.' + string[:4]  # ggf das letzte als string[2:4] wennde nur 2 stellige Jarheszahl haben willst  

tuts auch schon

greetz
simba
Member: yashi
yashi May 10, 2006 at 09:45:08 (UTC)
Goto Top
Hallo simba.

Ja, ursprünglich sah mein code auch so aus. Da aber entweder meine PSP9 console oder mein Python die Doppelpunkte als Steuerzeichen erkannt haben, musste ich sie durch Leerzeichen ersetzen. Der String wurde immer beim ersten ":" abgeschnitten. Also so:

"2006

Klingt komisch, ich weiß. Kann es mir auch nicht erklären.
Member: simba
simba May 10, 2006 at 22:45:24 (UTC)
Goto Top
Hmm in der Tat komisch, aber offensichtlich auch schon gelöst ;)


falls es hart auf hart kommt und die Strings mal nicht als Listen ansprechen kannst aus Gründen die mir gerade nicht einfallen wäre auch ein

string  = "2006:04:05 21:40:26"  
date, dummy = string.split(' ')  
jahr, monat, tag = date.split(':')  
tolles_datum = tag + '.' + monat + '.' + jahr  

denkbar. quasi die java Variante mit Einbringung der tollen python Mehrfachzuweisung ;)

Viele Wege führen nach Rom


cheers
simba