Pixelgröße einer .JPG-Datei mit VBA ?

Guten Tag,

kann man mit VBA (Excel 2003) die Pixelgröße einer .JPG- oder .gif-Datei ermitteln?

Wozu brauche ich das? In einer Excel-Tabelle habe ich viele Datensätze, aus denen mittels VBA eine HTML-Datei erzeugt wird, die dann mit einem Browser angezeigt wird. Darin sind u.a. Bilder verschiedener Größe, die abhängig davon und von der Position der Maus so plaziert werden müssen (Aufblenden per AREA- und IMG-Tag), dass es die richtige Position gegenüber anderen Bildteilen hat. Das wird durch die VBA-Prozedur berechnet und in die HTML-Datei eingetragen.

Danke
Laika

Hi Laika,

kann man mit VBA (Excel 2003) die Pixelgröße einer .JPG- oder
.gif-Datei ermitteln?

ich würde sagen ja.
Dummerweise fällt mir absolut nicht ein wie die Seite heißt. Jedenfalls sind auf dieser Webseite die ich meine die Dateiformate vieler Dateiendungen gelistet und wenn die Pixelanzahl in den Dateien an einer festen Stelle stünde, kann man die auslesen mit Vba.
Die Seite heißt whohis.org o.ä.
Ich kram mal zuhause nach wie sie genau heißt, und wenn dort jpg und gif so erklärt wird daß man die Pixelanzahl ermitteln kann ist deine Anfrage gelöst.
Gruß
Reinhard

Wozu brauche ich das? In einer Excel-Tabelle habe ich viele
Datensätze, aus denen mittels VBA eine HTML-Datei erzeugt
wird, die dann mit einem Browser angezeigt wird. Darin sind
u.a. Bilder verschiedener Größe, die abhängig davon und von
der Position der Maus so plaziert werden müssen (Aufblenden
per AREA- und IMG-Tag), dass es die richtige Position
gegenüber anderen Bildteilen hat. Das wird durch die
VBA-Prozedur berechnet und in die HTML-Datei eingetragen.

Danke
Laika

Hallo Laika
Ich habe leider das VBA nicht sondern VB5.
In VB5 kann ich ein Bild in eine ImageBox laden, und dann die Picturex.Image.width und Picturex.Image.height Werte abfragen.
Picturex = z.B. Picture1, Autosize muß auf true glaub ich.
Dieser Wert ist dann in Twips und kann mit einer Umwandlungsfunktion in Pixel umgewandelt werden. Ich meinte letztere Funktion heißt Object, bzw. Container.TwipsPerPixel oder so.
ein x oder ein y für die jeweilige Richtung ist auch noch irgendwie dabei.
Das bei Bildern irgendwo die Größe steht, ist zwar klar, aber zum einen recht müsam, weil man von einer in C geschriebenen Struktur ausgehen muß, die auch noch variieren könnte.
Per Windows API kann man außerdem das Bild in einen ausreichend großen Container laden, und per API die Eigenschaften des enthaltenen Objekts, hier das Bild, erfragen. Die Infos stehen dann nachher z.B. in einem BitmapInfoHeader, bzw. einer BitmapInfo Struktur.
Ein fertiges Konzept kann ich aber so im Moment nicht anbieten.
MfG
Matthias

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Laika und Matthias,

sorry aber teilweise schreibst du sehr grossen Mist :frowning:
Richtig ist das man unter VB das Bild in eine PictureBox laden kann und dann die grösse abfragen kann und ggfls. umrechnen.

Aber was ist wenn man keine freie PictureBox zur Verfügung hat, wo man dies nutzen kann? Extra deswegen eine einbauen. Da schiesst du mit Kanonen auf Spatzen!

Es reicht vollkommen aus, wenn du ein StdPicture erzeugst und dann die Daten abfragst. Aber auch das ist in meine Augen umstaendlich!

Du kannst mit leichtigkeit den Header auslesen und nicht wie von dir beschrieben das es sehr aufwaendig sei und schwer :s

Ein kleines Demo was dies tut. Sollte unter VBA und VB laufen

Public Function GetPictureSize(sFile As String, x As Long, y As Long) As Boolean
Dim strDummy As String
Dim ff As Integer
Dim c As Integer
Dim S As String
Dim L As Long
Dim JPGWidth As Long
Dim JPGHeight As Long
 ff = FreeFile()
 Open sFile For Binary Access Read As #ff
 ' Test auf JPEG-Datei
 If Input(2, #ff) (Chr$(&HFF) & Chr$(&HD8)) Then
 Close #ff
 Exit Function
 End If
 strDummy = Input(2, #ff)
 Do
 L = Asc(Input(1, #ff))
 L = L \* 256 + Asc(Input(1, #ff))
 S = Input(L - 2, #ff)
 If c = &HC0 Or c = &HC2 Then
 JPGWidth = Asc(Mid$(S, 4, 1))
 x = JPGWidth \* 256 + Asc(Mid$(S, 5, 1))
 JPGHeight = Asc(Mid$(S, 2, 1))
 y = JPGHeight \* 256 + Asc(Mid$(S, 3, 1))
 End If
 If Input(1, #ff) Chr$(255) Then
 Exit Do
 End If
 c = Asc(Input(1, #ff))
 Loop While c &HD9
 Close #ff
 GetPictureSize = True
End Function

Ein Aufruf, alla

Private Sub Command1\_Click()
 Dim x As Long
 Dim y As Long
 If GetPictureSize("f:\a.jpg", x, y) Then
 MsgBox "Breite: " & x & vbNewLine & "Höhe: " & y
 Else
 MsgBox "Fehler beim auslesen der JPEG Information!", vbCritical
 End If
End Sub

liefert die gewuenschten Daten. Und wie man sieht sind es nur ein paar Zeilen Code. Sicher sollte man noch prüfen ob die Datei existiert etc.
Aber ist wie gesagt nur nen Demo :smile:

MfG Alex

Hi Laika,

kann man mit VBA (Excel 2003) die Pixelgröße einer .JPG- oder
.gif-Datei ermitteln?

ich würde sagen ja.

Definitiv ja. Siehe Beitrag oben :wink:

Dummerweise fällt mir absolut nicht ein wie die Seite heißt.
Jedenfalls sind auf dieser Webseite die ich meine die
Dateiformate vieler Dateiendungen gelistet und wenn die
Pixelanzahl in den Dateien an einer festen Stelle stünde, kann
man die auslesen mit Vba.

Es kommt auf die Version an. je nachdem steht der wert an einer anderen Stelle :smile: Aber das auszulesen und zu beruecksichtigen ist der kummer sein kleinster :smile:

Die Seite heißt whohis.org o.ä.

Du meinst http://www.wotsit.org ?

Ich kram mal zuhause nach wie sie genau heißt, und wenn dort
jpg und gif so erklärt wird daß man die Pixelanzahl ermitteln
kann ist deine Anfrage gelöst.

Ist doch schon gelöst :smiley:

Gruß
Reinhard

MfG Alex

Wozu brauche ich das? In einer Excel-Tabelle habe ich viele
Datensätze, aus denen mittels VBA eine HTML-Datei erzeugt
wird, die dann mit einem Browser angezeigt wird. Darin sind
u.a. Bilder verschiedener Größe, die abhängig davon und von
der Position der Maus so plaziert werden müssen (Aufblenden
per AREA- und IMG-Tag), dass es die richtige Position
gegenüber anderen Bildteilen hat. Das wird durch die
VBA-Prozedur berechnet und in die HTML-Datei eingetragen.

Danke
Laika

Danke!
Hallo Alex,

danke für die Antwort und den fix und fertigen Code. habe ihn einfach nur kopiert, eines meiner Bilder eingebaut und … es funktioniert einwandfrei.

Vielleicht sieht Matthias dir die Ruppigkeit mit dem „großen Mist, den er schreibt“, nach :wink:)

Laika

Noch was: .gif?
Hallo Alex,

wo hast du die allgemeine Beschreibung der Datei her?
Für .gif-Bilder brauche ich sowas auch noch.
Werde auch selbst mal googeln.

Gruß,
Laika

Hallo Laika,

Also wenn du mal die Seite http://www.wotsit.org einen Besuch abstattest, so findest du dort zu so ziemlich allen Files den Aufbau :smile:

Aber bei Gif Files, stehen die gewünschten Informationen an Byte 7 und 9! Diese musst du nur auslesen. Die ersten 3 Byte müssen wenn du sie mit Chr wandelst GIF ergeben! Machen sie das nicht, so ist es ein ungueltiges File! An den Bytes 4 -6 steht die Version. Zum Bsp. 89a
Naja lange Rede kurzer Sinn :smiley:

Hier eine Function die dir das Ergebnis liefert :smile:

Option Explicit

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)

Private Function GetPictureInfo(sFile As String, X As Long, Y As Long) As Boolean
Dim FF As Byte
Dim Header As String
Dim vData As Byte
Dim vRet(1) As Byte
Dim I As Byte
 If Dir(sFile) = "" Then MsgBox "Unglültige Datei!", vbCritical, "Error": Exit Function
 FF = FreeFile
 Open sFile For Binary As #FF
 For I = 0 To 5
 Get #FF, , vData
 Header = Header & Chr(vData)
 Next I
 If Left(Header, 3) "GIF" Then
 MsgBox "Keine gültige Gif-Datei.", vbCritical, "Error"
 Close #FF
 Exit Function
 End If
 Get #FF, 7, vRet
 CopyMemory X, vRet(0), 2
 Get #FF, 9, vRet
 CopyMemory Y, vRet(0), 2
 Close #FF
 GetPictureInfo = True
End Function

'Ein Aufruf könnte wiefolgt ausschauen :smile:

Dim X As Long, Y As Long
 If GetPictureInfo("f:\a.gif", X, Y) Then MsgBox "Breite: " & X & vbNewLine & "Höhe: " & Y

MfG Alex

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]