Inhaltsplugin "Imgsize" - Normformate anzeigen

German support forum

Moderators: Hacker, Stefan2, white

User avatar
Peter
Power Member
Power Member
Posts: 2068
Joined: 2003-11-13, 13:40 UTC
Location: Schweiz

Inhaltsplugin "Imgsize" - Normformate anzeigen

Post by *Peter »

Guten Tag

Das Plugin "Imgsize" gibt die Länge und Breite in Pixel sowie die Beschreibungen "klein, mittel, gross, .. aus".

Ich habe nun massenweise Tifs, die in 400 DPI erstellt wurden und sich vor allem in den Normformaten A4 - A2 bewegen, teilweise massiv darüber (meist Hochformat, teilweise quer).

Ich verstehe die Ini leider nicht ganz, und so frage ich mich, ob

a) man statt Pixel auch cm umrechnen und anzeigen kann.
Die mathematische Berechnung ist nicht schwer - aber wie packt man das ins System?

Hier die Berechnung cm in Pixel:

Code: Select all

cm       DPI      Inch         Pixel
21       400      2.54         3307
29.7     400      2.54         4677
42       400	   2.54         6614
59.4     400      2.54         9354
b) Kann man die Grössenbeschreibung auf Normformate ändern? Also mit der Logik "wenn du unter der Grösse bist, da bist du A4; wenn du unter jener Grösse bist, dann A3; die Grössen ... brauchen A2 und alles was grösser ist als A2 ist "Riesig".

Schönen Abend

Peter
TC 10.xx / #266191
Win 10 x64
icfu
Power Member
Power Member
Posts: 6052
Joined: 2003-09-10, 18:33 UTC

Post by *icfu »

Um die INI zu verstehen, empfiehlt es sich, die Readme zu lesen.
b) ist damit problemlos möglich, wenn ich Dich richtig verstanden habe.

Icfu
This account is for sale
User avatar
Peter
Power Member
Power Member
Posts: 2068
Joined: 2003-11-13, 13:40 UTC
Location: Schweiz

Post by *Peter »

Gelesen habe ich die readme schon, nur das Verstehen der Zahlenlogik ist ein Problem für mich. Und die Gruppenlogik scheint sich auf zwei Gruppengrennzen zu beschränken: kleiner als "A" ist klein, grösser als "B" ist gross, alles dazwischen ist mittel.

Hat vielleicht schon wer eine geänderte INI erstellt?

Peter
TC 10.xx / #266191
Win 10 x64
User avatar
van Dusen
Power Member
Power Member
Posts: 684
Joined: 2004-09-16, 19:30 UTC
Location: Sinzig (Rhein), Germany

Script bildgröße_jpg.vbs; DPI; Ausgabegröße; DIN Papiermaße

Post by *van Dusen »

Übergangsweise kannst Du Dir mit einem vbs-Script für das Inhaltsplugin ScriptWDX behelfen. Das folgende Script ermittelt die Info zurzeit nur für *.jpg-Dateien. Für *.tif-Dateien werde ich das Script noch erweitern.

Das Script gibt in einer benutzerdefinierten Spalte [=script.Result] Ergebnisstrings folgenden Musters aus:

Code: Select all

{Auflösungs-Kategorie}  •  [{Auflösung X}×]{Auflösung Y} ppi  •  {Pixelmaß X}×{Pixelmaß Y} Pixel  •  {Ausgabegröße X}×{Ausgabegröße Y} cm²  •  {DIN-Papiermaß}
Also z.B.

Code: Select all

B - Print (MedRes)  •  720 ppi  •  3.744×2.494 Pixel  •  13,21×8,80 cm²  •  DIN D6 (quer)

{Auflösungs-Kategorie}:
>= 1.200 dpi/ppi ... "A - Print (HiRes)"
>= 600 dpi/ppi ... "B - Print (MedRes)"
>96 dpi/ppi ... "C - Print (LoRes)"
Sonst ... "D - Screen"

{DIN-Papiermaß}:
"DIN Ax|Bx|Cx|Dx [(quer)]"

Wenn die Papiermaße stets auf die Maße der DIN A-Serie bezogen werden sollen, dann im Script die Zeile 13 von
dinserienura = 0
ändern in
dinserienura = 1
Für Bilder, für die ein DIN B- oder DIN C-Format ausreichend wäre, wird dann das nächstgrößere DIN A-Format angezeigt (z.B. DIN B6 -> DIN A5), bei DIN A- und DIN D-Formaten wird das DIN A-Format der gleichen Nummer angezeigt (z.B. DIN D6 -> DIN A6).


Das Script <bildgröße_jpg.vbs>:

Code: Select all

'Bildgröße_jpg.vbs, V0.1, 01.03.2006, van Dusen
'Script for Script Content Plugin
'(c)Lev Freidin, 2005
'http://www.totalcmd.net/plugring/script_wdx.html
'http://wincmd.ru/plugring/script_wdx.html

Dim fso, f
Set fso = CreateObject("Scripting.FileSystemObject")

result = ""
'*** dinserienura = 0, wenn DIN A-, B-, C- und D-Formate angezeigt werden sollen
'*** dinserienura = 1, wenn nur DIN A-Formate angezeigt werden sollen
dinserienura = 0

If LCase(fso.GetExtensionName(filename)) = "jpg" Then

   '*** xFFD8: Start Of Image-Tag
   segsoi = Chr(255) & Chr(216)
   
   '*** xFFE0: JFIF-Tag
   segjff = Chr(255) & Chr(224)
   
   '*** xFFC0: Image Format Information-Tag
   segifi = Chr(255) & Chr(192)
   
   '*** JFIF-Tag mit der dpi/ppi-Info braucht nicht vorhanden zu sein;
   '*** Fehlwert auf 72 ppi/dpi setzen, um Division durch 0 bei Berechnung der Ausgabegröße zu verhindern
   ydpi = 72
   xdpi = 72
   dpidef = " (Fehlwert)"

   Set f = fso.OpenTextFile(filename, 1, False)

   segmark = f.Read(2)
   If segmark = segsoi Then
   
      Do
         segmark = f.Read(2)
         seglen = Asc(f.Read(1)) * 256 + Asc(f.Read(1))

         Select Case segmark

            '*** JFIF-Tag
            Case segjff
               f.Skip(8)
               ydpi = Asc(f.Read(1)) * 256 + Asc(f.Read(1))
               xdpi = Asc(f.Read(1)) * 256 + Asc(f.Read(1))
               
               '*** Wenn das JPG keine (sinnvolle) DPI-Info enthält, 72 DPI annehmen
               If xdpi < 2 Or ydpi < 2 Then
                  xdpi = 72
                  ydpi = 72
               Else
                  dpidef = ""
               End If
               
               f.Skip(seglen - 14)

            '*** Image Format Information-Tag
            Case segifi
               f.Skip(1)
               ypix = Asc(f.Read(1)) * 256 + Asc(f.Read(1))
               xpix = Asc(f.Read(1)) * 256 + Asc(f.Read(1))
               
               '*** Ergebnisstring basteln:
               '*** Auflösungs-Kategorie
               dpicat = "D - Screen  •  "
               If xdpi > 96 Or ydpi > 96 Then dpicat = "C - Print (LoRes)  •  "
               If xdpi >= 600 Or ydpi >= 600 Then dpicat = "B - Print (MedRes)  •  "
               If xdpi >= 1200 Or ydpi >= 1200 Then dpicat = "A - Print (HiRes)  •  "
               result = dpicat
               
               '*** Auflösung
               If xdpi <> ydpi Then result = result & xdpi & "×" 
               result = result & ydpi & " ppi" & dpidef & "  •  "
               
               '*** Pixelmaße
               result = result & FormatNumber(xpix, 0) & "×" & FormatNumber(ypix, 0) & " Pixel  •  "
               
               '*** Ausgabegröße
               xcm = xpix * 2.54 / xdpi
               ycm = ypix * 2.54 / ydpi
               result = result & FormatNumber(xcm, 2) & "×" & FormatNumber(ycm, 2) & " cm²  •  "
               
               '*** Erforderliches DIN-Papiermaß (DIN Bx > DIN Cx > DIN Ax > DIN Dx)
               '*** GGf. ins Hochformat "drehen" (oben/unten = kurze Kante, links/rechts = lange Kante)
               xdinausricht = ""
               If xcm > ycm Then
                  tcm = xcm
                  xcm = ycm
                  ycm = tcm
                  xdinausricht = " (quer)"
               End If
               
               xdinexpb = Fix(Log(xcm/100) / Log(1.0905))
               xdinexph = xdinexpb + 4
               ydinexpb = Fix(Log(ycm/100) / Log(1.0905))

               If xdinexph < ydinexpb Then xdinexpb = xdinexpb - (xdinexph - ydinexpb)

               dinserie = Mid("BCAD", Abs(xdinexpb) Mod 4 + 1, 1)
               dinnr = Abs(Fix(xdinexpb / 4))
               
               If dinserienura = 1 Then
                  If dinserie = "B" Or dinserie = "C" Then dinnr = dinnr - 1
                  dinserie = "A"
               End If
               
               result = result & "DIN " & dinserie & dinnr & xdinausricht
               
               Exit Do

            '*** Sonstiges Tag / Lesefehler (Synchronisationsproblem)
            Case Else
               '*** Wenn Tag = xFF##, dann ist noch alles OK -> Tag überlesen
               If Left(segmark, 1) = Chr(255) Then
                  f.Skip(seglen-2)
               '*** Wenn Tag <> xFF##, dann ist das Script "aus dem Tritt" geraten -> Script verlassen
               Else
                  result = "# Fehler beim Lesen der Datei"
                  Exit Do
               End If

         End Select

      Loop

   End If

   f.Close
   Set f=nothing
   
End If

content = result

Set fso=nothing

Die passende <script.ini>:

Code: Select all

[Script]
Section=BildgroesseJpg

[Defaults]
LongName=1
ParseDirs=0

[BildgroesseJpg]
LongName=0
ParseDirs=0
Script=bildgröße_jpg.vbs
User avatar
Peter
Power Member
Power Member
Posts: 2068
Joined: 2003-11-13, 13:40 UTC
Location: Schweiz

Post by *Peter »

van Dusen

sorry für die späte Antwort - die automatische Benachrichtigung dürfte mich im Stich gelassen haben.

Danke für das Script - ich werde es mal übernehmen, obwohl wir fast nur mit Tif arbeiten.

Grüsse

Peter
TC 10.xx / #266191
Win 10 x64
User avatar
van Dusen
Power Member
Power Member
Posts: 684
Joined: 2004-09-16, 19:30 UTC
Location: Sinzig (Rhein), Germany

Bildgröße_tif.vbs

Post by *van Dusen »

Hallo Peter,

am 02.März hatte ich ja angekündigt, das Script noch für TIFF-Dateien zu erweitern. Hier ist nun endlich, das Script für TIFF-Dateien (zwar keine Erweiterung des Scripts für JPEGs, sondern ein separates nur für TIFF, aber egal)

Das Script gibt in einer benutzerdefinierten Spalte [=script.Result] Ergebnisstrings folgenden Musters aus:

Code: Select all

{Auflösungs-Kategorie}  •  [{Auflösung X}×]{Auflösung Y} ppi  •  {Pixelmaß X}×{Pixelmaß Y} Pixel  •  {Ausgabegröße X}×{Ausgabegröße Y} cm²  •  {DIN-Papiermaß}  •  {Papiergröße X}×{Papiergröße Y} cm²  •  {Rand beim Drucken links und rechts} mm . {Rand beim Drucken oben und unten} mm
Also zum Beispiel:

Wenn booZeigePapierMassDINnurA = 0

Code: Select all

D - Screen • 72 ppi • 429×640 Pixel • 15,13×22,58 cm² • DIN C5 • 16,21×22,93cm² • 5,4mm · 1,8 mm
Das selbe Bild, wenn booZeigePapierMassDINnurA = 1

Code: Select all

D - Screen • 72 ppi • 429×640 Pixel • 15,13×22,58 cm² • DIN A4 • 21,03×29,73cm² • 29,5mm · 35,8 mm
Der vom Script fehlwertmäßig ausgegebene Ergebnisstring ist also ziemlich lang. Wenn Du nicht alle Angaben benötigst, kannst Du im Script fast ganz oben einzelne "Felder" des Ergebnisstrings für die Anzeige ein- oder ausschalten (1=ein; 0=aus)

Code: Select all

booZeigeAufloesungsKategorie = 1/0
booZeigeBildGroessePixel = 1/0
booZeigeBildAufloesungDPI = 1/0
booZeigeBildAusgabeGroesseCm = 1/0
booZeigePapierMassDIN = 1/0
booZeigePapierGroesseCm = 1/0
booZeigePapierRaenderMm = 1/0
Mit

Code: Select all

booZeigePapierMassDINnurA = 1
kannst Du einschalten, dass nur Papiermaße der DIN A-Serie benutzt werden sollen (wie schon im JPEG-Script)

Das Script wertet nur das erste "Image File Directory" einer TIFF-Datei aus; falls es sich bei einer Datei also um ein Multipage-TIFF handelt, ermittelt das Script bestenfalls die Info für das erste Bild.

Hier nun das Script <bildgröße_tif.vbs>:

Code: Select all

'*** Bildgröße_tif.vbs, V0.1, 15.03.2006, van Dusen
'*** Script for Script Content Plugin
'*** (c)Lev Freidin, 2005
'*** http://www.totalcmd.net/plugring/script_wdx.html
'*** http://wincmd.ru/plugring/script_wdx.html

Dim fso, f
Set fso = CreateObject("Scripting.FileSystemObject")

result = ""

'*** Welche Angaben soll der Ergebnis-String enthalten?
'*** 0 = Nicht anzeigen; 1 = Anzeigen
booZeigeAufloesungsKategorie = 1
booZeigeBildGroessePixel = 1
booZeigeBildAufloesungDPI = 1
booZeigeBildAusgabeGroesseCm = 1
booZeigePapierMassDIN = 1
booZeigePapierGroesseCm = 1
booZeigePapierRaenderMm = 1

'*** 0 = DIN A-, B-, C- und D-Formate werden verwendet
'*** 1 = Nur Papiermaße der DIN A-Serie werden verwendet
booZeigePapierMassDINnurA = 0

If LCase(fso.GetExtensionName(filename)) = "tif" Then

	picdpidef = " (Fehlwert)"
	lngIFDEntryValOffsetXRes = 0
	lngIFDEntryValOffsetYRes = 0
	unitperinch = 1
	xpicpix = 0
	ypicpix = 0
	
	Set f = fso.OpenTextFile(filename, 1, False)	
	
	lngFP = 0
	
	'*** Byteorder ("II" = little-endian; "MM" = big-endian)
	booByteOrder = 0
	If f.Read(2) = "II" Then booByteOrder = 1
	lngFP = lngFP + 2

	'*** "42"
	f.Skip(2)
	lngFP = lngFP + 2
	
	'*** Offset des ersten IFD (Image File Directory) ermitteln
	strRaw = f.Read(4)
	lngFP = lngFP + 4
	If booByteOrder = 0 Then strRaw = StrReverse(strRaw)
	lngIFDOffset = 0
	For i = 1 To 4
		lngIFDOffset = lngIFDOffset + Asc(Mid(strRaw, i, 1)) * 256^(i-1)
	Next
	
	'*** Zum ersten IFD springen (8 Bytes wurden bereits gelesen)
	'*** (Offsetangaben sind immer vom Start des TIF gerechnet;  erstes Byte der Datei hat Offset=0)
	f.Skip(lngIFDOffset - 8)
	lngFP = lngFP + lngIFDOffset - 8
	
	'*** Anzahl der Einträge des ersten IFD ermitteln
	strRaw = f.Read(2)
	lngFP = lngFP + 2
	If booByteOrder = 0 Then strRaw = StrReverse(strRaw)
	intIFDEntryCount = 0
	For i = 1 To 2
		intIFDEntryCount = intIFDEntryCount + Asc(Mid(strRaw, i, 1)) * 256^(i-1)
	Next

	'*** IFD-Einträge lesen: Jeder Eintrag ist 12 Bytes lang
	'*** Tag(2), Datentyp(2), ValAnz(4), ValOff(4)
	For intIFDEntryCurrent = 1 To intIFDEntryCount
		
		'*** Tag
		'*** Hier nur die für dieses Script interessanten:
		'*** TagName        Dec Hex Typ und Werte
		'*** ImageWidth     256 100 SHORT oder LONG
		'*** ImageLength    257 101 SHORT oder LONG
		'*** XResolution    282 11A RATIONAL
		'*** YResolution    283 11B RATIONAL
		'*** ResolutionUnit 296 128 SHORT (1=Keine, 2=Inch (Fehlwert), 3=Zentimeter)

		strRaw = f.Read(2)
		lngFP = lngFP + 2
		If booByteOrder = 0 Then strRaw = StrReverse(strRaw)
		intIFDEntryTag = 0
		For i = 1 To 2
			intIFDEntryTag = intIFDEntryTag + Asc(Mid(strRaw, i, 1)) * 256^(i-1)
		Next

		'*** Datentyp des Feldes
		'*** 1  = BYTE      8-bit unsigned integer
		'*** 2  = ASCII     8-bit byte that contains a 7-bit ASCII code; the last byte must be NUL (binary zero)
		'*** 3  = SHORT     16-bit (2-byte) unsigned integer
		'*** 4  = LONG      32-bit (4-byte) unsigned integer
		'*** 5  = RATIONAL  Two LONGs: the first represents the numerator of a fraction; the second, the denominator
		'*** 6  = SBYTE     An 8-bit signed (twos-complement) integer
		'*** 7  = UNDEFINED An 8-bit byte that may contain anything, depending on the definition of the field
		'*** 8  = SSHORT    A 16-bit (2-byte) signed (twos-complement) integer
		'*** 9  = SLONG     A 32-bit (4-byte) signed (twos-complement) integer
		'*** 10 = SRATIONAL Two SLONG’s: the first represents the numerator of a fraction, the second the denominator
		'*** 11 = FLOAT     Single precision (4-byte) IEEE format
		'*** 12 = DOUBLE    Double precision (8-byte) IEEE format
		
		strRaw = f.Read(2)
		lngFP = lngFP + 2
		If booByteOrder = 0 Then strRaw = StrReverse(strRaw)
		intIFDEntryDatatype = Hex(Asc(Left(strRaw, 1)))
		intIFDEntryDatatype =  InStr("123456789ABC", intIFDEntryDatatype)
		intIFDEntryDatatypeLen = CInt(Mid("112481124848", Asc(Left(strRaw, 1)), 1))
		
		'*** Anzahl Daten
		strRaw = f.Read(4)
		lngFP = lngFP + 4
		If booByteOrder = 0 Then strRaw = StrReverse(strRaw)
		lngIFDEntryValCount = 0
		For i = 1 To 4
			lngIFDEntryValCount = lngIFDEntryValCount + Asc(Mid(strRaw, i, 1)) * 256^(i-1)
		Next
		
		'*** Offset der Daten ODER die Daten selbst
		'*** (sofern die Daten in die 4 Bytes hineinpassen UND das Tag es "erlaubt")
		strRaw = f.Read(4)
		lngFP = lngFP + 4
		If intIFDEntryDatatypeLen =< 4 Then
			strRaw = Left(strRaw, intIFDEntryDatatypeLen)
			iend = intIFDEntryDatatypeLen
		Else
			iend = 4
		End If
		If booByteOrder = 0 Then strRaw = StrReverse(strRaw)
		lngIFDEntryValOffset = 0
		For i = 1 To iend
			lngIFDEntryValOffset = lngIFDEntryValOffset + Asc(Mid(strRaw, i, 1)) * 256^(i-1)
		Next
		
		Select Case intIFDEntryTag
			Case 256
				xpicpix = lngIFDEntryValOffset
			Case 257
				ypicpix = lngIFDEntryValOffset
			Case 282
				lngIFDEntryValOffsetXRes = lngIFDEntryValOffset
			Case 283
				lngIFDEntryValOffsetYRes = lngIFDEntryValOffset
			Case 296
				unitperinch = 1
				If lngIFDEntryValOffset = 3 Then unitperinch = 2.54
			Case Else
				'NOP
		End Select

	Next
	

	'*** X-Auflösung ermitteln
   '*** TIFF-IFD-Tag mit der dpi/ppi-Info braucht nicht vorhanden zu sein;
   '*** Fehlwert auf 72 ppi/dpi setzen, um Division durch 0 bei Berechnung der Ausgabegröße zu verhindern
   xpicdpi = 72
	If lngIFDEntryValOffsetXRes > 0 Then
		
		If lngIFDEntryValOffsetXRes >= lngFP Then
			f.Skip(lngIFDEntryValOffsetXRes - lngFP)
		Else
			f.Close
			Set f=nothing
			Set f = fso.OpenTextFile(filename, 1, False)
			f.Skip(lngIFDEntryValOffsetXRes)
		End If
		lngFP = lngIFDEntryValOffsetXRes
		
		'*** Zähler
		strRaw = f.Read(4)
		lngFP = lngFP + 4
		If booByteOrder = 0 Then strRaw = StrReverse(strRaw)
		lngZaehler = 0
		For i = 1 To 4
			lngZaehler = lngZaehler + Asc(Mid(strRaw, i, 1)) * 256^(i-1)
		Next
		
		'*** Nenner
		strRaw = f.Read(4)
		lngFP = lngFP + 4
		If booByteOrder = 0 Then strRaw = StrReverse(strRaw)
		lngNenner = 0
		For i = 1 To 4
			lngNenner = lngNenner + Asc(Mid(strRaw, i, 1)) * 256^(i-1)
		Next
		
		xpicdpi = lngZaehler * unitperinch / lngNenner
		'*** Wenn das TIF keine (sinnvolle) DPI-Info enthält, 72 DPI annehmen
		If xpicdpi = 0 Then
			xpicdpi = 72
		Else
			picdpidef = ""
		End If
		
	End If
	
	'*** Y-Auflösung ermitteln
   '*** TIFF-IFD-Tag mit der dpi/ppi-Info braucht nicht vorhanden zu sein;
   '*** Fehlwert auf 72 ppi/dpi setzen, um Division durch 0 bei Berechnung der Ausgabegröße zu verhindern
   ypicdpi = 72
	If lngIFDEntryValOffsetYRes > 0 Then
		
		If lngIFDEntryValOffsetYRes >= lngFP Then
			f.Skip(lngIFDEntryValOffsetYRes - lngFP)
		Else
			f.Close
			Set f=nothing
			Set f = fso.OpenTextFile(filename, 1, False)
			f.Skip(lngIFDEntryValOffsetYRes)
		End If
		'lngFP = lngIFDEntryValOffsetYRes

		'*** Zähler
		strRaw = f.Read(4)
		'lngFP = lngFP + 4
		If booByteOrder = 0 Then strRaw = StrReverse(strRaw)
		lngZaehler = 0
		For i = 1 To 4
			lngZaehler = lngZaehler + Asc(Mid(strRaw, i, 1)) * 256^(i-1)
		Next
		
		'*** Nenner
		strRaw = f.Read(4)
		'lngFP = lngFP + 4
		If booByteOrder = 0 Then strRaw = StrReverse(strRaw)
		lngNenner = 0
		For i = 1 To 4
			lngNenner = lngNenner + Asc(Mid(strRaw, i, 1)) * 256^(i-1)
		Next
		
		ypicdpi = lngZaehler * unitperinch / lngNenner
		'*** Wenn das TIF keine (sinnvolle) DPI-Info enthält, 72 DPI annehmen
		If ypicdpi = 0 Then
			ypicdpi = 72
		Else
			picdpidef = ""
		End If
		
	End If
	
	
	f.Close
	Set f=nothing
	
	
	'*** Ergebnisstring basteln:
	'*** Auflösungs-Kategorie
	picdpicat = "D - Screen  •  "
	If xpicdpi > 96 Or ypicdpi > 96 Then picdpicat = "C - Print (LoRes)  •  "
	If xpicdpi >= 600 Or ypicdpi >= 600 Then picdpicat = "B - Print (MedRes)  •  "
	If xpicdpi >= 1200 Or ypicdpi >= 1200 Then picdpicat = "A - Print (HiRes)  •  "
	If booZeigeAufloesungsKategorie = 1 Then result = picdpicat
	
		
	'*** Auflösung
	If xpicdpi <> ypicdpi Then result = result & xpicdpi & "×" 
	If booZeigeBildAufloesungDPI = 1 Then result = result & ypicdpi & " ppi" & picdpidef & "  •  "
	
	
	'*** Pixelmaße
	If booZeigeBildGroessePixel = 1 Then result = result & FormatNumber(xpicpix, 0) & "×" & FormatNumber(ypicpix, 0) & " Pixel  •  "
	
	
	'*** Ausgabegröße
	xpiccm = xpicpix * 2.54 / xpicdpi
	ypiccm = ypicpix * 2.54 / ypicdpi
	If booZeigeBildAusgabeGroesseCm = 1 Then result = result & FormatNumber(xpiccm, 2) & "×" & FormatNumber(ypiccm, 2) & " cm²  •  "
	
		
	'*** Erforderliches DIN-Papiermaß (DIN Bx > DIN Cx > DIN Ax > DIN Dx)
	'*** GGf. ins Hochformat "drehen" (oben/unten = kurze Kante, links/rechts = lange Kante)
	xdinausricht = ""
	If xpiccm > ypiccm Then
		tpiccm = xpiccm
		xpiccm = ypiccm
		ypiccm = tpiccm
		xdinausricht = " (quer)"
	End If
	
	xdinexpb = Fix(Log(xpiccm/100) / Log(1.0905))
	xdinexph = xdinexpb + 4
	ydinexpb = Fix(Log(ypiccm/100) / Log(1.0905))
	
	If xdinexph < ydinexpb Then
		xdinexpb = xdinexpb - (xdinexph - ydinexpb)
		xdinexph = xdinexpb + 4
	End If
	
	dinserie = Mid("BCAD", Abs(xdinexpb) Mod 4 + 1, 1)
	dinnr = Abs(Fix(xdinexpb / 4))
	
	If booZeigePapierMassDINnurA = 1 Then
		xdinexpb = xdinexpb + InStr("ADBC", dinserie) - 1
		xdinexph = xdinexph + InStr("ADBC", dinserie) - 1
		If dinserie = "B" Or dinserie = "C" Then dinnr = dinnr - 1
		dinserie = "A"
	End If
	
	If booZeigePapierMassDIN = 1 Then result = result & "DIN " & dinserie & dinnr & xdinausricht & "  •  "	
	
	
	'*** Papiergröße und Ränder links und rechts / oben und unten
	xdincm = 1.0905^xdinexpb * 100
	ydincm = 1.0905^xdinexph * 100
	If xdinausricht = " (quer)" Then
		If booZeigePapierGroesseCm = 1 Then result = result & FormatNumber(ydincm, 2) & "×" & FormatNumber(xdincm, 2) & " cm²  •  "
		'If booZeigePapierRaenderMm = 1 Then result = result & FormatNumber((ydincm-ypiccm) / 2, 2) & " cm · " & FormatNumber((xdincm-xpiccm) / 2, 2) & " cm"
		If booZeigePapierRaenderMm = 1 Then result = result & FormatNumber((ydincm-ypiccm) * 5, 1) & " mm · " & FormatNumber((xdincm-xpiccm) * 5, 1) & " mm"
	Else
		If booZeigePapierGroesseCm = 1 Then result = result & FormatNumber(xdincm, 2) & "×" & FormatNumber(ydincm, 2) & " cm²  •  "
		'If booZeigePapierRaenderMm = 1 Then result = result & FormatNumber((xdincm-xpiccm) / 2, 2) & " cm · " & FormatNumber((ydincm-ypiccm) / 2, 2) & " cm"
		If booZeigePapierRaenderMm = 1 Then result = result & FormatNumber((xdincm-xpiccm) * 5, 1) & " mm · " & FormatNumber((ydincm-ypiccm) * 5, 1) & " mm"
	End If
	
End If

content = result

Set fso=nothing

Die dazu passende <script.ini>:

Code: Select all

[Script]
Section=BildgroesseTIF

[Defaults]
LongName=1
ParseDirs=0

[BildgroesseTIF]
LongName=0
ParseDirs=0
Script=bildgröße_tif.vbs
User avatar
Peter
Power Member
Power Member
Posts: 2068
Joined: 2003-11-13, 13:40 UTC
Location: Schweiz

Post by *Peter »

Besten Dank - ich werde es morgen einbauen.

Peter
TC 10.xx / #266191
Win 10 x64
User avatar
Peter
Power Member
Power Member
Posts: 2068
Joined: 2003-11-13, 13:40 UTC
Location: Schweiz

Post by *Peter »

Guten Morgen

ich habe

ein Tif mit 165.74x70.48 cm² mit DIN A-1 (quer)

ein Tif mit 322.76x87.34 cm² mit DIN A1 (quer)

Was ist der Unterschied zwischen DIN A1 und DIN A-1?
Sind die "Quadratzentimeter" nicht falsch, weil nur Zentimeter?

Peter
TC 10.xx / #266191
Win 10 x64
User avatar
Sheepdog
Power Member
Power Member
Posts: 5150
Joined: 2003-12-18, 21:44 UTC
Location: Berlin, Germany
Contact:

Post by *Sheepdog »

Peter wrote: 165.74x70.48 cm² mit DIN A-1 (quer)

ein Tif mit 322.76x87.34 cm² mit DIN A1 (quer)

Sind die "Quadratzentimeter" nicht falsch, weil nur Zentimeter?
Nein, das ist so korrekt. Sonst müsste es heißen

165.74 cm x 70.48 cm
322.76 cm x 87.34 cm

also jede Zahl mit Maßeinheit versehen.

Mit der DIN Norm scheinen aber beide Formate nichts gemeinsam zu haben:

A 0 = 841 mm x 1189 mm
A 1 = 594 mm x 841 mm
A 2 = 420 mm x 594 mm

sheepdog
"A common mistake that people make when trying to design something
completely foolproof is to underestimate the ingenuity of complete fools."
Douglas Adams
User avatar
Peter
Power Member
Power Member
Posts: 2068
Joined: 2003-11-13, 13:40 UTC
Location: Schweiz

Post by *Peter »

Sheepdog wrote:
Peter wrote: ... 165.74x70.48 cm²...

Nein, das ist so korrekt. Sonst müsste es heißen

165.74 cm x 70.48 cm
322.76 cm x 87.34 cm

also jede Zahl mit Maßeinheit versehen.
...
Philosophiemodus ein

165.74x70.48 cm² ist nicht richtig, weil das sagt, ich habe etwas, das 70.48cm² gross ist, und dieses Ding habe ich 165.74 mal.
165.74 cm x 70.48 cm wäre richtig, und wichtig ist die Tatsache, dass das "x" (mal) mathematisch eine Multiplikation vortäuscht, die es gar nicht gibt. Weil hier geht es nicht um die Fläche (die wird ja gar nicht ausgerechnet, darum gibt es auch keine cm²), sondern um die Abmessungen.

Und anstelle der langen Formulierung "Das Bild ist 70 cm lang und 30 cm hoch" hat sich eingebürgert: "das Bild ist 70 zu 30 cm (falsche Division); das Bild ist 70 auf 30cm; das Bild ist 70 x 30 cm (falsche Multiplikation)"
Philosophiemodus aus

Aber die Formate selbst muss man noch überdenken.

Peter
TC 10.xx / #266191
Win 10 x64
User avatar
Hacker
Moderator
Moderator
Posts: 13142
Joined: 2003-02-06, 14:56 UTC
Location: Bratislava, Slovakia

Post by *Hacker »

Mathematikmodus ein
165.74x70.48 cm² ist nicht richtig, weil das sagt, ich habe etwas, das 70.48cm² gross ist, und dieses Ding habe ich 165.74 mal.
Es ist richtig, weil es im Endeffekt das gleiche Ergebnis liefert.
Mathematikmodus aus
;)

Roman
Mal angenommen, du drückst Strg+F, wählst die FTP-Verbindung (mit gespeichertem Passwort), klickst aber nicht auf Verbinden, sondern fällst tot um.
User avatar
van Dusen
Power Member
Power Member
Posts: 684
Joined: 2004-09-16, 19:30 UTC
Location: Sinzig (Rhein), Germany

Post by *van Dusen »

Peter wrote:Was ist der Unterschied zwischen DIN A1 und DIN A-1?
DIN A-1 ("DIN A minus 1") müsste korrekt DIN 2A0 heißen. Es handelt sich um um das Papierformat mit doppelter DIN A0-Größe. Entsprechend wäre DIN A-2 ("Din A minus 2") korrekt DIN 4A0, also vierfache DIN A0-Größe. Die korrekte Benennung dieser Übergrößen habe ich im Script nicht berücksichtigt, das ließe sich aber recht leicht einbauen. Was sollte man dann allerdings mit "DIN A-3" und größer tun? Für diese Formate gibt es meines Wissens keine DIN, d.h., man müsste neue "Normen" erfinden und diese dann DIN 8A0 usw. benennen.
Peter wrote:Sind die "Quadratzentimeter" nicht falsch, weil nur Zentimeter?
Mit "X×Y cm²" hoffte ich richtig zu liegen; wenn diese Darstellung nicht richtig ist, würde gerne lernen, wie's korrekt ist (ganz ernst gemeint, denn ich "liebe" unpräzise, nebulöse, interpretationsfähige Angaben (wie z.B. "Zeichensatz: ANSI") auch immer sehr). Davon abgesehen lässt sich der Ausgabestring ja in Sekundenschnelle entsprechend anpassen. Ich werd' das derweil mal auf "Bx cm, Hy cm" ändern, obwohl man die Werte dann zwischen den Textkonstanten und Maßeinheiten schwerer erkennen kann.
Sheepdog wrote:[...]
165.74 cm x 70.48 cm
322.76 cm x 87.34 cm
[...]
Mit der DIN Norm scheinen aber beide Formate nichts gemeinsam zu haben:

A 0 = 841 mm x 1189 mm
A 1 = 594 mm x 841 mm
A 2 = 420 mm x 594 mm
Hier liegt offensichtlich noch ein Fehler vor, sobald ein Papiermaß mit Übergröße (also größer als DIN A0) benötigt wird :( . Die Papiergröße in cm (B/H) wird aber korrekt ausgegeben, soweit ich das bisher geprüft habe, "nur" die DIN-Angabe ist falsch. Werde ich korrigieren.

Danke für Eure Hinweise!
User avatar
Peter
Power Member
Power Member
Posts: 2068
Joined: 2003-11-13, 13:40 UTC
Location: Schweiz

Post by *Peter »

van Dusen

ich habe so eine Kategorisierung der Formate mal nach der Logik gemacht, das die Formate bis A1 abgedeckt waren und alles darüber nur nach der Breite eingeteilt wurde - und zwar nach der notwendigen Breite der Papierrolle im Plotter (30 / 42 / 60 / 84 / > 84 cm), wenn man das Bild ausplotten will.

Code: Select all

wenn    kurze Seite und     lange Seite dann
        <= 210              <=  297     A4
        211 – 297           <= 420      A3
        298 – 420           <= 594      A2
        421 – 594           <= 841      A1
        <= 210              298 – 420   A3
         (könnte auch Rolle 30 sein, aber besser A3, weil A3 auf normalem Drucker druckbar)
        <= 210              > 420       30 cm Rolle
        211 – 297           > 420       30 cm Rolle
        298 – 420           > 594       42 cm Rolle
        421 – 594           > 841       60 cm Rolle
        595 – 814           egal        84 cm Rolle
        > 814       egal    105 cm Rolle (Spezialplotter)
Weil für mich ist bei der Geschichte wichtig, welchen Drucker / Plotter ich für Ausdrucke in Originalgrösse nehmen muss.

Zu den ominösen cm²: Ich bin weiterhin der Meinung, das hier das Wort bzw. Zeichen "x mal" keine Multiplikation ausdrückt, sondern die beiden Zahlen verbal (nicht mathematisch) verbindet.

Peter
TC 10.xx / #266191
Win 10 x64
User avatar
Sheepdog
Power Member
Power Member
Posts: 5150
Joined: 2003-12-18, 21:44 UTC
Location: Berlin, Germany
Contact:

Post by *Sheepdog »

Peter wrote:Zu den ominösen cm²: Ich bin weiterhin der Meinung, das hier das Wort bzw. Zeichen "x mal" keine Multiplikation ausdrückt, sondern die beiden Zahlen verbal (nicht mathematisch) verbindet.
DIN A0 ist das Format, dessen Fläche 1 m² beträgt, wobei die beiden Kanten das Verhältnis von 1 zu √2 oder auch 1:1,4142 haben. und 841 mm mal 1189 mm lang sind und 999949 mm² bedecken.
Dieses Verhältnis wurde so gewählt, da bei halbieren eines solchen Blattes 2 Blätter im gleichen Verhältnis entstehen.

Peter wrote:Und anstelle der langen Formulierung "Das Bild ist 70 cm lang und 30 cm hoch" hat sich eingebürgert: "das Bild ist 70 zu 30 cm (falsche Division); das Bild ist 70 auf 30cm; das Bild ist 70 x 30 cm (falsche Multiplikation)"
Du lässt Dich dadurch verwirren, dass in der Aussage 70cm x 30cm zwei Aussagen stecken. Zum Einen wird damit tatsächlich eine genau definierte Fläche (in cm²) beschrieben, aber eben auch das Seitenbverhältnis von 7:3 (oder auch 70:30). Hier handelt es sich auch nicht um eine 'falsche' Division, sondern um ein Verhältnis. Wenn ich dies ausrechne (70cm : 30cm =2,333) so erhalte ich den Betrag, mit dem ich die eine Seitenlänge (30cm) multiplizieren muss, um den Betrag der anderen Seite (70cm) zu erhalten. Ich kann diese Rechnung auch umdrehen, 30:70, und sie stimmt immer noch, nur für die andere Seite (30 cm : 70cm =0,42857).

Das DIN A1 Format beschreibt jedenfalls eine Fläche deren Seiten das Verhältnis 1:√2 haben und 59,4cmx84,1cm= 4995,54 cm² bedeckt.

sheepdog
"A common mistake that people make when trying to design something
completely foolproof is to underestimate the ingenuity of complete fools."
Douglas Adams
User avatar
van Dusen
Power Member
Power Member
Posts: 684
Joined: 2004-09-16, 19:30 UTC
Location: Sinzig (Rhein), Germany

bildgröße_jpgtif.vbs V0.3

Post by *van Dusen »

Neuer Versuch: <bildgröße_jpgtif.vbs>, Version 0.3

Version 0.3 des Scripts unterstützt *.jpg- und *.tif-Dateien.

Die Fehler des alten Scripts bei der Ermittlung des DIN-Papierformats (und dessen Größe) habe ich hoffentlich beseitigen können.

Was die Anzeige der Bildausgabegröße und der Papierfläche betrifft, habe ich jetzt die Darstellung {B} cm × {H} cm gewählt. Ich jedenfalls halte diese Form für Flächenangaben nicht für falsch. Man kann dies im Script ja je nach Gusto ändern, ein paar auskommentierte Alternativdarstellungen sind schon enthalten.

Neu habe ich eine "Druckerempfehlung" aufgenommen, die entsprechend der Bildausgabegröße einen Drucker / Plotter aus dem Wertebereich "A4-Drucker", "A3-Drucker", "Plotter 30 cm", ..., "Plotter 105 cm", "(Kein Drucker)" auswählt.

Entsprechend gibt es ein Flag zum Ein-/Ausblenden dieser Info und eine Flag, welches steuert, ob die Druckränder auf das ermittelte DIN-Papierformat oder auf das vom empfohlenen Drucker maximal verarbeitbare Papierformat bezogen werden sollen.

Der Ausgabestring für die Druckränder enthält jetzt zusätzlich die Angabe, ob das Bild für die Ausgabe auf dem Drucker gedreht werden muss ("90°") oder nicht ("0°").

Hier nun das Script (ist leider ziemlich monströs geworden). Für weitere Fehlerhinweise wäre ich dankbar:

Code: Select all

'*** Bildgröße_jpgtif.vbs, V0.3, 18.03.2006, van Dusen
'*** Script for Script Content Plugin
'*** (c)Lev Freidin, 2005
'*** http://www.totalcmd.net/plugring/script_wdx.html
'*** http://wincmd.ru/plugring/script_wdx.html

Dim fso, f
Set fso = CreateObject("Scripting.FileSystemObject")

result = ""

'*** Welche Angaben soll der Ergebnis-String enthalten?
'*** 0 = Nicht anzeigen
'*** 1 = Anzeigen
booZeigeAufloesungsKategorie = 1
booZeigeBildAufloesungDPI = 1
booZeigeBildGroessePixel = 1
booZeigeBildAusgabeGroesseCm = 1
booZeigeDrucker = 1
booZeigePapierMassDIN = 1
booZeigePapierGroesseCm = 1

'*** 0 = Nicht anzeigen
'*** 1 = Ränder auf das ermittelte DIN-Format beziehen
'*** 2 = Ränder auf das vom empfohlenen Drucker max. verarbeitbare Papierformat beziehen
booZeigePapierRaenderMm = 2

'*** 0 = DIN A-, B-, C- und D-Formate verwenden
'*** 1 = Nur Papiermaße der DIN A-Serie verwenden
booZeigePapierMassDINnurA = 1

'====================================================================================================
'JPEG-Dateien auswerten
'====================================================================================================

If LCase(fso.GetExtensionName(filename)) = "jpg" Then
	
	'*** xFFD8: Start Of Image-Tag
	segsoi = Chr(255) & Chr(216)
	
	'*** xFFE0: JFIF-Tag
	segjff = Chr(255) & Chr(224)
	
	'*** xFFC0: Image Format Information-Tag
	segifi = Chr(255) & Chr(192)
	
	'*** JFIF-Tag mit der dpi/ppi-Info braucht nicht vorhanden zu sein;
	'*** Fehlwert auf 72 dpi/ppi setzen, um Division durch 0 bei Berechnung der Ausgabegröße zu verhindern
	ypicdpi = 72
	xpicdpi = 72
	picdpidef = " (Fehlwert)"
	
	Set f = fso.OpenTextFile(filename, 1, False)
	
	segmark = f.Read(2)
	If segmark = segsoi Then
		
		Do
			segmark = f.Read(2)
			seglen = Asc(f.Read(1)) * 256 + Asc(f.Read(1))
			
			Select Case segmark
				
				'*** JFIF-Tag
				Case segjff
					f.Skip(8)
					ypicdpi = Asc(f.Read(1)) * 256 + Asc(f.Read(1))
					xpicdpi = Asc(f.Read(1)) * 256 + Asc(f.Read(1))
					
					'*** Wenn das JPG keine (sinnvolle) DPI-Info enthält, 72 DPI annehmen
					If xpicdpi < 2 Or ypicdpi < 2 Then
						xpicdpi = 72
						ypicdpi = 72
					Else
						picdpidef = ""
					End If
					
					f.Skip(seglen - 14)
					
				'*** Image Format Information-Tag
				Case segifi
					f.Skip(1)
					ypicpix = Asc(f.Read(1)) * 256 + Asc(f.Read(1))
					xpicpix = Asc(f.Read(1)) * 256 + Asc(f.Read(1))
					Exit Do
					
				'*** Sonstiges Tag / Lesefehler (Synchronisationsproblem)
				Case Else
					'*** Wenn Tag = xFF##, dann ist noch alles OK -> Tag überlesen
					If Left(segmark, 1) = Chr(255) Then
						f.Skip(seglen-2)
					'*** Wenn Tag <> xFF##, dann ist das Script "aus dem Tritt" geraten -> Script verlassen
					Else
						result = "# Fehler beim Lesen der Datei"
						Exit Do
					End If
					
			End Select
			
		Loop
		
	End If
	
	f.Close
	Set f=nothing
	
End If


'====================================================================================================
'TIFF-Dateien auswerten
'====================================================================================================

If LCase(fso.GetExtensionName(filename)) = "tif" Then
	
	picdpidef = " (Fehlwert)"
	lngIFDEntryValOffsetXRes = 0
	lngIFDEntryValOffsetYRes = 0
	unitperinch = 1
	xpicpix = 0
	ypicpix = 0
	
	Set f = fso.OpenTextFile(filename, 1, False)	
	
	lngFP = 0
	
	'*** Byteorder ("II" = little-endian; "MM" = big-endian)
	booByteOrder = 0
	If f.Read(2) = "II" Then booByteOrder = 1
	lngFP = lngFP + 2
	
	'*** "42"
	f.Skip(2)
	lngFP = lngFP + 2
	
	'*** Offset des ersten IFD (Image File Directory) ermitteln
	strRaw = f.Read(4)
	lngFP = lngFP + 4
	If booByteOrder = 0 Then strRaw = StrReverse(strRaw)
	lngIFDOffset = 0
	For i = 1 To 4
		lngIFDOffset = lngIFDOffset + Asc(Mid(strRaw, i, 1)) * 256^(i-1)
	Next
	
	'*** Zum ersten IFD springen (8 Bytes wurden bereits gelesen)
	'*** (Offsetangaben sind immer vom Start des TIF gerechnet;  erstes Byte der Datei hat Offset=0)
	f.Skip(lngIFDOffset - 8)
	lngFP = lngFP + lngIFDOffset - 8
	
	'*** Anzahl der Einträge des ersten IFD ermitteln
	strRaw = f.Read(2)
	lngFP = lngFP + 2
	If booByteOrder = 0 Then strRaw = StrReverse(strRaw)
	intIFDEntryCount = 0
	For i = 1 To 2
		intIFDEntryCount = intIFDEntryCount + Asc(Mid(strRaw, i, 1)) * 256^(i-1)
	Next
	
	'*** IFD-Einträge lesen: Jeder Eintrag ist 12 Bytes lang
	'*** Tag(2), Datentyp(2), ValAnz(4), ValOff(4)
	For intIFDEntryCurrent = 1 To intIFDEntryCount
		
		'*** Tag
		'*** Hier nur die für dieses Script interessanten:
		'*** TagName        Dec Hex Typ und Werte
		'*** ImageWidth     256 100 SHORT oder LONG
		'*** ImageLength    257 101 SHORT oder LONG
		'*** XResolution    282 11A RATIONAL
		'*** YResolution    283 11B RATIONAL
		'*** ResolutionUnit 296 128 SHORT (1=Keine, 2=Inch (Fehlwert), 3=Zentimeter)
		
		strRaw = f.Read(2)
		lngFP = lngFP + 2
		If booByteOrder = 0 Then strRaw = StrReverse(strRaw)
		intIFDEntryTag = 0
		For i = 1 To 2
			intIFDEntryTag = intIFDEntryTag + Asc(Mid(strRaw, i, 1)) * 256^(i-1)
		Next
		
		'*** Datentyp des Feldes
		'*** 1  = BYTE      8-bit unsigned integer
		'*** 2  = ASCII     8-bit byte that contains a 7-bit ASCII code; the last byte must be NUL (binary zero)
		'*** 3  = SHORT     16-bit (2-byte) unsigned integer
		'*** 4  = LONG      32-bit (4-byte) unsigned integer
		'*** 5  = RATIONAL  Two LONGs: the first represents the numerator of a fraction; the second, the denominator
		'*** 6  = SBYTE     An 8-bit signed (twos-complement) integer
		'*** 7  = UNDEFINED An 8-bit byte that may contain anything, depending on the definition of the field
		'*** 8  = SSHORT    A 16-bit (2-byte) signed (twos-complement) integer
		'*** 9  = SLONG     A 32-bit (4-byte) signed (twos-complement) integer
		'*** 10 = SRATIONAL Two SLONG’s: the first represents the numerator of a fraction, the second the denominator
		'*** 11 = FLOAT     Single precision (4-byte) IEEE format
		'*** 12 = DOUBLE    Double precision (8-byte) IEEE format
		
		strRaw = f.Read(2)
		lngFP = lngFP + 2
		If booByteOrder = 0 Then strRaw = StrReverse(strRaw)
		'intIFDEntryDatatype = Hex(Asc(Left(strRaw, 1)))
		'intIFDEntryDatatype =  InStr("123456789ABC", intIFDEntryDatatype)
		intIFDEntryDatatypeLen = CInt(Mid("112481124848", Asc(Left(strRaw, 1)), 1))
		
		'*** Anzahl Daten
		strRaw = f.Read(4)
		lngFP = lngFP + 4
		If booByteOrder = 0 Then strRaw = StrReverse(strRaw)
		lngIFDEntryValCount = 0
		For i = 1 To 4
			lngIFDEntryValCount = lngIFDEntryValCount + Asc(Mid(strRaw, i, 1)) * 256^(i-1)
		Next
		
		'*** Offset der Daten ODER die Daten selbst
		'*** (sofern die Daten in die 4 Bytes hineinpassen UND das Tag es "erlaubt")
		strRaw = f.Read(4)
		lngFP = lngFP + 4
		If intIFDEntryDatatypeLen =< 4 Then
			strRaw = Left(strRaw, intIFDEntryDatatypeLen)
			iend = intIFDEntryDatatypeLen
		Else
			iend = 4
		End If
		If booByteOrder = 0 Then strRaw = StrReverse(strRaw)
		lngIFDEntryValOffset = 0
		For i = 1 To iend
			lngIFDEntryValOffset = lngIFDEntryValOffset + Asc(Mid(strRaw, i, 1)) * 256^(i-1)
		Next
		
		Select Case intIFDEntryTag
			Case 256
				xpicpix = lngIFDEntryValOffset
			Case 257
				ypicpix = lngIFDEntryValOffset
			Case 282
				lngIFDEntryValOffsetXRes = lngIFDEntryValOffset
			Case 283
				lngIFDEntryValOffsetYRes = lngIFDEntryValOffset
			Case 296
				unitperinch = 1
				If lngIFDEntryValOffset = 3 Then unitperinch = 2.54
			Case Else
				'NOP
		End Select
	
	Next
	
	
	'*** X-Auflösung ermitteln
	'*** TIFF-IFD-Tag mit der dpi/ppi-Info braucht nicht vorhanden zu sein;
	'*** Fehlwert auf 72 dpi/ppi setzen, um Division durch 0 bei Berechnung der Ausgabegröße zu verhindern
	xpicdpi = 72
	If lngIFDEntryValOffsetXRes > 0 Then
		
		If lngIFDEntryValOffsetXRes >= lngFP Then
			f.Skip(lngIFDEntryValOffsetXRes - lngFP)
		Else
			f.Close
			Set f=nothing
			Set f = fso.OpenTextFile(filename, 1, False)
			f.Skip(lngIFDEntryValOffsetXRes)
		End If
		lngFP = lngIFDEntryValOffsetXRes
		
		'*** Zähler
		strRaw = f.Read(4)
		lngFP = lngFP + 4
		If booByteOrder = 0 Then strRaw = StrReverse(strRaw)
		lngZaehler = 0
		For i = 1 To 4
			lngZaehler = lngZaehler + Asc(Mid(strRaw, i, 1)) * 256^(i-1)
		Next
		
		'*** Nenner
		strRaw = f.Read(4)
		lngFP = lngFP + 4
		If booByteOrder = 0 Then strRaw = StrReverse(strRaw)
		lngNenner = 0
		For i = 1 To 4
			lngNenner = lngNenner + Asc(Mid(strRaw, i, 1)) * 256^(i-1)
		Next
		
		xpicdpi = lngZaehler * unitperinch / lngNenner
		'*** Wenn das TIF keine (sinnvolle) DPI-Info enthält, 72 DPI annehmen
		If xpicdpi = 0 Then
			xpicdpi = 72
		Else
			picdpidef = ""
		End If
		
	End If
	
	'*** Y-Auflösung ermitteln
	'*** TIFF-IFD-Tag mit der dpi/ppi-Info braucht nicht vorhanden zu sein;
	'*** Fehlwert auf 72 dpi/ppi setzen, um Division durch 0 bei Berechnung der Ausgabegröße zu verhindern
	ypicdpi = 72
	If lngIFDEntryValOffsetYRes > 0 Then
		
		If lngIFDEntryValOffsetYRes >= lngFP Then
			f.Skip(lngIFDEntryValOffsetYRes - lngFP)
		Else
			f.Close
			Set f=nothing
			Set f = fso.OpenTextFile(filename, 1, False)
			f.Skip(lngIFDEntryValOffsetYRes)
		End If
		'lngFP = lngIFDEntryValOffsetYRes
		
		'*** Zähler
		strRaw = f.Read(4)
		'lngFP = lngFP + 4
		If booByteOrder = 0 Then strRaw = StrReverse(strRaw)
		lngZaehler = 0
		For i = 1 To 4
			lngZaehler = lngZaehler + Asc(Mid(strRaw, i, 1)) * 256^(i-1)
		Next
		
		'*** Nenner
		strRaw = f.Read(4)
		'lngFP = lngFP + 4
		If booByteOrder = 0 Then strRaw = StrReverse(strRaw)
		lngNenner = 0
		For i = 1 To 4
			lngNenner = lngNenner + Asc(Mid(strRaw, i, 1)) * 256^(i-1)
		Next
		
		ypicdpi = lngZaehler * unitperinch / lngNenner
		'*** Wenn das TIF keine (sinnvolle) DPI-Info enthält, 72 DPI annehmen
		If ypicdpi = 0 Then
			ypicdpi = 72
		Else
			picdpidef = ""
		End If
		
	End If
	
	
	f.Close
	Set f=nothing
	
End If


'====================================================================================================
'Ergebnisstring basteln
'====================================================================================================
	
If (LCase(fso.GetExtensionName(filename)) = "jpg" Or LCase(fso.GetExtensionName(filename)) = "tif") And Left(result, 1) <> "#" Then
	
	k = 2^0.125
	
	'*** Auflösungs-Kategorie
	If booZeigeAufloesungsKategorie = 1 Then
		picdpicat = "D - Screen"
		If xpicdpi > 96 Or ypicdpi > 96 Then picdpicat = "C - Print (LoRes)"
		If xpicdpi >= 600 Or ypicdpi >= 600 Then picdpicat = "B - Print (MedRes)"
		If xpicdpi >= 1200 Or ypicdpi >= 1200 Then picdpicat = "A - Print (HiRes)"
		result = result & picdpicat
	End If
	
	
	'*** Auflösung
	If booZeigeBildAufloesungDPI = 1 Then
		result = result & "  •  "
		'*** Formal definitiv inkorrekte, aber übersichtlichere Darstellung:
		If xpicdpi <> ypicdpi Then result = result & xpicdpi & " × " 
		result = result & ypicdpi & " ppi" & picdpidef
	End If
	
	
	'*** Pixelmaße
	If booZeigeBildGroessePixel = 1 Then
		result = result & "  •  " & FormatNumber(xpicpix, 0) & " × " & FormatNumber(ypicpix, 0) & " px"
	End If
	
	
	'*** Ausgabegröße
	xpiccm = xpicpix * 2.54 / xpicdpi
	ypiccm = ypicpix * 2.54 / ypicdpi
	If booZeigeBildAusgabeGroesseCm = 1 Then
		'*** Formal eher inkorrekte, aber übersichtlichere Darstellung:
		'result = result & "  •  " & FormatNumber(xpiccm, 1) & "×" & FormatNumber(ypiccm, 1) & " cm²"
		'*** Formal vermutlich korrekte(re) Darstellung (Variante 1: Unverknüpfte Kantenmaße):
		'result = result & "  •  " & "B " & FormatNumber(xpiccm, 1) & "cm  H " & FormatNumber(ypiccm, 1) & "cm"
		'*** Formal vermutlich korrekte(re) Darstellung (Variante 2: Kantenmaße der BildFLÄCHE):
		result = result & "  •  " & FormatNumber(xpiccm, 1) & " cm × " & FormatNumber(ypiccm, 1) & " cm"
	End If
	
	
	'*** Erforderliches DIN-Papiermaß (DIN Bx > DIN Cx > DIN Ax > DIN Dx)
	'*** GGf. ins Hochformat "drehen" (oben/unten = kurze Kante, links/rechts = lange Kante)
	xdinausricht = ""
	If xpiccm > ypiccm Then
		tpiccm = xpiccm
		xpiccm = ypiccm
		ypiccm = tpiccm
		xdinausricht = " (quer)"
	End If
	'*** xpiccm            xpiccm
	'*** +----+            +--+
	'*** |^   |ypiccm ---> |  |ypiccm
	'*** +----+            |< |
	'***                   +--+
	
	
	'*** Paramter für das Papierformat ermitteln, und zwar getrennt für die kurze und die lange Kante des Bildes
	xdinexpb = Round(Log(xpiccm/100) / Log(k), 0)
	xdinexph = xdinexpb + 4
	ydinexpb = Round(Log(ypiccm/100) / Log(k), 0)
	'*** xdinexpb          (ydinexph)

	'*** +--+.+            +--+......+
	'*** |  | :            |  |      :
	'*** |< | :xdinexph    |< |      :ydinexpb
	'*** +--+ :            +--+      :
	'*** :    :            +.........+
	'*** +....+
	
	'*** Das kleinstpassende der beiden oben ermittelten Papierformate wählen
	If xdinexph < ydinexpb Then
		xdinexpb = xdinexpb - (xdinexph - ydinexpb)
		xdinexph = xdinexpb + 4
	End If
	
	'*** Durch Rundungsfehler können die Parameter für ein Paperformat gewählt worden sein, welches um einige mm zu klein ist
	'*** Daher hier prüfen, ob das Bild aufs Papier passen würde und die Parameter fürs Papierformat ggf. korrigieren
	'*** Toleranz: 1 mm
	xdincm = k^xdinexpb * 100
	ydincm = k^xdinexph * 100
	If Round(xpiccm, 1) - Round(xdincm, 1) > 0 Or Round(ypiccm, 1) - Round(ydincm, 1) > 0 Then
		xdinexpb = xdinexpb + 1
		xdinexph = xdinexph + 1
	End If
	
	
	'*** Druckerempfehlung (A4- oder A3-Drucker oder Plotter + benötigte Papierrollenbreite)
	drucker = "?"
	'Breite     Höhe
	'>  0,0     > 42,0     30 cm Rolle
	'> 29,7     > 59,4     42 cm Rolle
	'> 42,0     > 84,1     60 cm Rolle
	'> 59,4       egal     84 cm Rolle
	'> 81,4       egal    105 cm Rolle (Spezialplotter)
	
	'*** A4-Drucker (Fehlwert)

	'drucker = "A4-Drucker (21,0×29,7)"
	drucker = "A4-Drucker"
	xpapiercm = 21.0
	ypapiercm = 29.7
	
	'*** A3-Drucker
	If xdinexpb > -18 Then
		'drucker = "A3-Drucker (29,7×42,0)"
		drucker = "A3-Drucker"
		xpapiercm = 29.7
		ypapiercm = 42.0
	End If
	
	'*** Plotter
	If xdinexpb > -14 Then
		xpapiercm = 30
		ypapiercm = 0
		If xpiccm > 30 Then xpapiercm = 42
		If xpiccm > 42 Then xpapiercm = 60
		If xpiccm > 60 Then xpapiercm = 84
		If xpiccm > 84 Then xpapiercm = 105
		drucker = "Plotter " & xpapiercm & " cm"
		If xpiccm > 105 Then
			drucker = "(Kein Drucker)"
			xpapiercm = 0
		End If
	End If					
	If booZeigeDrucker = 1 Then result = result & "  •  " & drucker
	
	
	'*** DIN-Serie (A, B, C, D) und DIN-SerienNr bestimmen
	dinserie = Mid("BDAC", (xdinexpb + 400) Mod 4 + 1, 1)
	dinnr = Fix((xdinexpb + 400) / 4 - 0.25) - 99
	dinnr = -1 * dinnr
	
	'*** Wenn nur Papierformate der DIN A-Serie verwendet werden sollen,
	'*** dann bei B-, C-, D-Formaten das nächstgrößere A-Papierformat bestimmen
	If booZeigePapierMassDINnurA = 1 Then
		xdinexpb = xdinexpb + InStr("ADBC", dinserie) - 1
		xdinexph = xdinexph + InStr("ADBC", dinserie) - 1
		If dinserie = "B" Or dinserie = "C" Then dinnr = dinnr - 1
		dinserie = "A"
	End If
	
	If booZeigePapierMassDIN = 1 Then
		'*** Übergrößen nicht mit negativen SerienNr ausgeben, sondern mit Flächenfaktor bezogen auf SerienNr 0
		'*** (also z.B. "DIN 2A0" statt "DIN A-1")
		If dinnr < 0 Then
			result = result & "  •  " & "DIN " & 2^Abs(dinnr) & dinserie & "0" & xdinausricht
		Else
			result = result & "  •  " & "DIN " & dinserie & dinnr & xdinausricht
		End If
	End If
	
	
	'*** Papiergröße, erforderliche Bilddrehung sowie Druckränder links und rechts / oben und unten ermitteln
		
	xdincm = k^xdinexpb * 100
	ydincm = k^xdinexph * 100
	bilddrehung = "0°"
	
	'*** Einstellung booZeigePapierRaenderMm = 1: Ränder auf das ermittelte DIN-Format beziehen
	If booZeigePapierRaenderMm = 1 Then
		xpapiercm = xdincm
		ypapiercm = ydincm
		If xdinausricht = " (quer)" Then bilddrehung = "90°"
	End If
	
	'*** Einstellung booZeigePapierRaenderMm = 2: Ränder auf die Druckerempfehlung beziehen
	'*** (xpapiercm/ypapiercm wurden bereits oben unter "Druckerempfehlung" ermittelt)
	If booZeigePapierRaenderMm = 2 Then
		If xdinausricht = " (quer)" Then
			If ypiccm > xpapiercm Then
				bilddrehung = "90°"
			Else
				tpiccm = xpiccm
				xpiccm = ypiccm
				ypiccm = tpiccm
			End If
		End If
	End If
	
	xdincmresult = FormatNumber(xdincm, 1) & " cm"
	ydincmresult = FormatNumber(ydincm, 1) & " cm"
	
	If xpapiercm = 0 Then
		bilddrehung = "—"
		xrandresult = "—"
	Else
		'*** Ränder in cm
		'xrandresult = FormatNumber((xpapiercm-xpiccm) / 2, 1) & " cm"
		'*** Ränder in mm
		xrandresult = FormatNumber((xpapiercm-xpiccm) * 5, 0) & " mm"
	End If
	
	If ypapiercm = 0 Then
		yrandresult = "—"
	Else
		'*** Ränder in cm
		'yrandresult = FormatNumber((ypapiercm-ypiccm) / 2, 1) & " cm"
		'*** Ränder in mm
		yrandresult = FormatNumber((ypapiercm-ypiccm) * 5, 0) & " mm"
	End If
	
	'*** Papiergröße in Ergebnisstring aufnehmen
	If booZeigePapierGroesseCm = 1 Then
		If xdinausricht = " (quer)" Then			
			'*** Darstellung: Kantenmaße der PapierFLÄCHE:
			result = result & " · " & ydincmresult & " × " & xdincmresult
		Else
			'*** Darstellung: Kantenmaße der PapierFLÄCHE:
			result = result & " · " & xdincmresult & " × " & ydincmresult
		End If
	End If
	
	'*** Ränder links und rechts / oben und unten in Ergebnisstring aufnehmen
	If booZeigePapierRaenderMm > 0 Then
		result = result & "  •  " & bilddrehung & " · "
		If booZeigePapierRaenderMm = 2 Or (booZeigePapierRaenderMm < 2 And xdinausricht = "") Then
			result = result & xrandresult & " · " & yrandresult
		Else
			result = result & yrandresult & " · " & xrandresult
		End If
	End If
	
End If

content = result

Set fso=nothing
Post Reply