# Von Twip in cm



## MacInternet (30. Juli 2007)

Hallöchen, 

es gibt leider ein weiteres Problem, dessen Lösung ich nicht finden kann. Sollte eigentlich ganz einfach sein - und klappt dennoch nicht:

der Anwender bekommt von den Bild-Dateien, die er anklickt, die Größe des Bildes mitgeteilt. In cm, weil dem Anwender Pixel herzlich wenig sagen.

VB errechnet ja nun die Bildgröße in Twip. Ich gehe davon aus, daß das ein Längenmass ist - oder liege ich da falsch?

Jedenfalls ergeben 100 Twip eine Einheit von 0,1766888 cm. Damit - sollte man meinen  - ließe sich doch ganz einfach mit einem Dreisatz die reale Größe in cm angeben.

Weit gefehlt: die angegebenen Werte stimmen nicht annähernd mit den realen Werten der Dateigröße überein. Sie sind im Schnitt etwa ein Drittel zu groß angegeben. 
Ich habe jetzt mehrere Funktionen, die angeblich alle Bildgrößen in cm angeben können, getestet - mit dem gleichen enttäuschenden Ergebnis. 

*Daher meine Frage: Kann es sein, daß Twip gar kein Längenmass ist und vielleicht die dpi mit berüchsichtigt werden müssen? Ich habe langsam keine andere Erklärung dafür.
Es wäre schön, wenn mir irgendjemand verraten könnte, wie ich die Bildgröße ermitteln und in cm angeben kann, ohne solch gravierende abweichende Werte zu bekommen. *

Kann mir da bitte jemand helfen?

Dank und Gruß,
Mac


----------



## Philipp9494 (30. Juli 2007)

Hallo.

Ich kann es leider aus technischen Gründen nicht testen, aber les einmal:



			
				wikipedia.de hat gesagt.:
			
		

> *Twip*
> 
> *aus Wikipedia, der freien Enzyklopädie*
> 
> ...


----------



## Elvan (30. Juli 2007)

zur Umrechnung:

normalerweise sind 15 Twips = 1 Pixel
Warum "normalerweise"?
Naja, Twips sind halt Einheiten pro Zoll. Das bedeutet, das Du bei verschiedenen Auflösungen (DeskTop) immer dieselbe relative Position hast.
300 Twips Breite ist also (egal bei welcher Auflösung) immer gleich groß,
Eine Box von 100 Pixel x 100 Pixel wäre bei 1024 x 768 aber kleiner, als bei 800 x 600.


----------



## MacInternet (30. Juli 2007)

Philipp9494 hat gesagt.:


> Hallo.
> 
> Ich kann es leider aus technischen Gründen nicht testen, aber les einmal:



Ja, danke, das unterstützt meine Theorie, daß Twips unabhängig von der Auflösung anzusehen sind. Aber löst nicht die Bohne das Problem, warum eine von Twips auf cm umgerechnete Größe nicht der realen Größe entspricht....

Gruß Mac


----------



## MacInternet (30. Juli 2007)

Elvan hat gesagt.:


> zur Umrechnung:
> 
> normalerweise sind 15 Twips = 1 Pixel
> Warum "normalerweise"?
> ...



Ja, aber welche Auflösung setzt Du denn beim Vergleich zu Pixeln dort vorraus, wenn du schreibst "normalerweise"?  - 100 dpi? Es muß doch irgendeine *Grundsatzeinheit *im Bereich der Auflösung geben, nach der das alles umgerechnet werden kann - wenigstens so, daß es einigermassen hinkommt. Auch die Größe in cm ist ja abhängig von der Auflösung des Monitors - dennoch stimmen die errechneten Werte bei der Umrechnung mit keinen anderen Werten überein.


Beispiel: ich habe einen ermittelten Wert von einer Breite von 1515 Twips. Das müssten dementsprechend 2,672294 cm sein. In Wirklichkeit ist das Bild aber gerade mal gut 1 cm breit! Und das verstehe ich nicht....
*grummel*

Jedes andere normale Programm kann doch auch die Bildgröße in cm korrekt wiedergeben - warum denn BV nicht?

Mac


----------



## Elvan (30. Juli 2007)

1 cm = 567 Twips
1 Zoll = 1440 Twips
Noch schnell in ne Funktion und das ganze sieht so aus:

```
Public Function twips_to_cm(lTwips As Long) As Double
  twips_to_cm = CDbl(lTwips / 567)
End Function
```
Ich denke das sollte Dein Prob. lösen.

Hast Recht gehabt.
die Funktion war echt total fehlerhaft. Jetzt aber korrigiert und getestet


----------



## MacInternet (31. Juli 2007)

Danke für die Funktion. Allerdings löst das mein Problem keineswegs. Vielleicht ist das ja auch nicht klar rübergekommen:

es geht mir *nicht *darum, Funktionen zu finden, die die Bildgröße ermitteln oder umrechnen können, davon habe ich inzwischen etliche. Bloß haben sämtliche Funktionen eines gemeinsam: die ermittelte Größe stimmt überhaupt nicht! Nicht mal annähernd...

Es gibt z.B. in VB eine Funktion, die die Größe von HiMetric gleich in cm umrechnet:


```
With Picture2
        .Picture = LoadPicture(Pfadresult)
        If Err.Number = 0 Then
            nwidth = .ScaleX(.Width, vbHimetric, vbCentimeters)
            nHeight = .ScaleY(.Height, vbHimetric, vbCentimeters)
        End If
        .Picture = LoadPicture()
End With
```

Der Fehler muß also irgendwo anders liegen - aber ich kann ihn nicht finden! Darum geht es mir. 
Ich bekomme alle möglichen Werte ermittelt - aber kein einziger stimmt mit der Originalgröße der Datei überein... 
*schnief*

Kann wer helfen, auf die richtige Spur zu finden?
Danke, Mac


----------



## MacInternet (31. Juli 2007)

Elvan hat gesagt.:


> 1 cm = 567 Twips
> 1 Zoll = 1440 Twips
> Noch schnell in ne Funktion und das ganze sieht so aus:
> 
> ...



PS: Deine Funktion wandelt keine Twips in cm um. Schau sie Dir noch mal genauer an....
;-)

Gruß Mac


----------



## Elvan (31. Juli 2007)

erstmal "HiMetric" sagt mir leider nix.

Aber zu Deinem Prob.:
Kannst Du deine Picbox nicht einfach in "cm" ändern?
Dann hättest Du doch die Maße der geladenen Bilder in cm. Reiicht das vielleicht?
Ich verstehe dein Problem so:
Du willst Bilder laden un der Andwender soll das Bild resizen können in cm, oder ?


----------



## MacInternet (1. August 2007)

Elvan hat gesagt.:


> erstmal "HiMetric" sagt mir leider nix.
> 
> Aber zu Deinem Prob.:
> Kannst Du deine Picbox nicht einfach in "cm" ändern?
> ...





Hi Elvan,

nein, nein, es ist alles viel einfacher - und klappt dennoch nicht. Der Anwender soll nur die Größe in cm angezeigt bekommen, sonst nix. 

Vorweg: HiMetric ist wohl die Einheit, nach der VB tatsächlich die Größe ermittelt, danach wird sie dann wohl in Twips umgewandelt. 1 HiMetric ist 1/1000tel eines Zentimeters, also 0,01 mm. 
Und die Picturebox in "cm" umzuwandeln bringt gar nichts, weil das auf die Berechnung keinen Einfluss hat.

Ich geb mal ein Beispiel:

ich habe ein beliebiges Bild, dessen Original-Größe z.b. 2,77 x 4,28 cm ist. Ganz einfach also. 
VB ermittelt jetzt für die Größe einen Wert von Breite: 3300 und Höhe: 5070. Entweder HiMetric oder Twips, darüber schweigt es sich leider aus. 
Aber mit keiner einzigen Funktion - und ich hab schon mehr als 10 verschiedene gestestet! - bekommt man wieder die Original-Größe raus! Meistens wird eine zu große Größe zurückgegeben und je größer das Bild, desto größer die Abweichung. Bis hin zu fast 100% bei großen Bildern!
Da sowohl HiMetric als auch Twip ein von der Auflösung unabhängiges Längenmass sind, kann es daran nicht liegen. Und die PictureBox passt sich natürlich der Größe des Bildes an. Aber irgendwo muß doch ein Fehler sein.... 

Vielleicht helfen diese Angaben, dem Fehler weiter auf die Spur zu kommen....

Gruß Mac


----------



## Elvan (2. August 2007)

Soo...
Ich habe jetzt mal "VB" aufgemacht (und das mach ich eigendlich nie, bei solchen Problemlösungen).
Habe ne PixBox, 2 TextBoxen und einen CommandButton auf ne Form gepackt.
Nun habe ich in die PictureBox ein Bild geladen (400 x 300 Pixel)
http://tbn0.google.com/images?q=tbn...ww.sportantiquariat.de/sport/bilder/19521.JPG
Picbox.Autosize = True
Form1.Scalemode = Pixel
Jetzt habe ich mir Höhe und Breite des Bildes anzeigen lassen. (Stimmte alles)
Dann habe ich festgestellt, dass du scaleheigh benutzt versuchs mal mit der PicBox.Height.
Allerdings sind die Werte bei mir dieselben.


----------



## MacInternet (3. August 2007)

Guten Morgen, Elvan,

danke erst mal für die Mühe, die Du Dir machst, mir zu helfen, mein Problem zu lösen!

Also ich hab jetzt das gleiche Bild wie Du genommen mit dem Ergebnis:

die Pixelwerte werden sehr wohl richtig angezeigt (vorausgesetzt, man läßt alle Umrechnungsformeln weg und bedient sich der ermittelten Werte). Nur: die Pixelwerte sind so ziemlich die einzige Einheit, die dem Anwender nichts sagt im Zusammenhang mit meinem Programm. Außerdem sind Pixel empfindlich von der Auflösung abhängig. 
Da ich die Auflösung eines Bildes aber nicht so leicht ermitteln kann, kann ich aus den Pixeln auch nicht die cm errechnen. 
Mir bleibt also nix anderes übrig, als mir statt der Pixel die Zentimeter anzeigen zu lassen und genau da stimmt einiges nicht mehr. 

Das o.g. Bild hat folgende Masse (Breite mal Höhe): 
Pixel: 93 * 124, Zentimeter:* 3,28 * 4,37 *
angezeigte Werte: 
Pixel: 93 * 124, Zentimeter:* 2,46 * 3,28 *


Diese Funktion hier soll z.B. die HiMetric in Zentimeter umrechnen:


```
With Picture2
        .Picture = LoadPicture(Pfadresult)
        If Err.Number = 0 Then
            nwidth = .ScaleX(.Width, vbHimetric, vbCentimeters)
            nHeight = .ScaleY(.Height, vbHimetric, vbCentimeters)
        End If
        .Picture = LoadPicture()
End With
```

Ergebnis: 1,45 * 1,92 ........

Ich beisse gleich in die Tastatur..... Wo liegt bloß der Fehler?
Mac

PS: Scale.height und Picturebox.height sind bei mir übrigens auch identisch.


----------



## Elvan (3. August 2007)

Hi Mac,

ich versuch Dir doch gerne zu helfen.

Ähm nichts für ungut, aber bitte höre auf, deine Funktion zu posten, denn
1. ist das genaug genommen gar keine Funktion, sondern "nur" eine Gleichung. (Eine Funktion ist ein in sich abgeschlossener Code, der (meistens) einen Wert zurückgibt, aber wenigstens eine allgemeine Gültigkeit hat (und damit ausgelagert werden kann.)
2. ....ich hab sie im Kopf und sie steht ja nun oft genug hier und wir wollen ja nichts verschwenden.

Aber nun sag mir doch mal wie Du auf
  Pixel: 93 * 124,   ---->>  Zentimeter: 3,28 * 4,37 
diese cm Werte kommst.

Die anderen können nur richtig sein.

Dein Fehler ist, das Du, den .ScaleMode nicht richtig gesetzt hast.
Denn Dein ScaleMode ist Twips, nun rechnest Du von Himetric in cm, schickst aber Twips rein!
Richtig ist:

```
'um sicher zu gehen
Form1.ScaleMode = 7
With Picture2
  Picture = LoadPicture(Pfadresult)
  If Err.Number = 0 Then
    nwidth = .ScaleX(.Width, vbTwips, vbCentimeters)
    nHeight = .ScaleY(.Height, vbTwips, vbCentimeters)
  End If
  .Picture = LoadPicture()
End With
```


----------

