Spalten und Zeilen eines Tif-Bildes ermitteln

Hallo, ich bin's schon wieder.

Kennt vielleicht jemand einen Algorithmus, mit dem sich die Spalten und Zeilen eines tif-Bildes ermitteln lassen?

Vielen Dank im Vorraus,
Uli
Hallo Uli,

IRasterLayer.Rowcount / .columncount.

Viele Grüße
Jörg Ostendorp
Hallo Jörg,
vielen Dank schonmal.

Leider geht der Algorithmus von ArcGis immer davon aus, dass es sich um quadratische Pixel handelt.
Sind diese aber nicht quadratisch, so ist das Ergebnis falsch und somit auch das Worldfile. Deshalb suche ich nach einem allgemeinen Algorithmus, mit dem sich die Spalten und Zeilen eines Rasterbildes ermitteln lassen.

Viele Grüße
Ulrike
Hallo U.,

wie definierst du die Spalten und Zeilen einer Rastergrafik? Moechtest du nicht die Anzahl der Zeilen und Spalten berechnen?

Gruss

Uwe
Hallo zusammen,

ergänzend gefragt: möchtest Du also wissen, aus wievielen (realen) *Pixeln* Dein Bild horizontal und vertikal besteht?
Wenn ja, gibt's AFAIK keine ganz einfache Lösung, zumindest keine auf die auf AV aufsetzt. Du könntest halt z.B. hergehen und Dir direkt die Tiff-Header selbst auslesen oder etwas bequemer mit der gdiplus von MS arbeiten.

Viele Grüße
Jörg Ostendorp
Hallo,

ich möchte die Anzahl der Zeilen und Spalten der tif-Bilder ermitteln. Da aber die ESRI-Software stets davon ausgeht, dass beide Pixelseiten die Länge der y-Axis haben, ist die Berechnung der Zeilenanzahl bei nicht quadratischen Pixeln falsch.
Auf die Lösung mit dem tif-Header sind wir auch schon gekommen, aber das dauert halt seine Zeit...
Und was ist "gdiplus von MS "?

Viele Grüße
Uli
Hallo Uli,

ist wirklich alles ein wenig merkwürdig... Daß .Row- und .Columncount andere Werte als die Pixel wiedergeben, könnte ich ja noch verstehen, seltsam ist dann aber, daß im Eigenschaftsfenster eines Rasterlayers korrekte Werte für "Zeilen" und "Spalten" angezeigt werden. In der Hilfe steht überdies für IRasterProps .Heigt/.Width explizit "Heigt in *Pixel*"/"Width in *Pixel*". Auch hier kriege ich falsche Werte zurück und zwar egal ob ich einen Raster auf einen Rasterlayer oder auf ein *neu* geöffnetes Rasterdataset drauf setze.
(Bsp: Bild mit 2x2 Pixel, Horizontale Auflösung 10 dpi, vertikale 20 dpi liefert als Columncount/Width 4 als Rowcount/Height 2)
Vielleicht hat ja jemand anderes eine Erklärung dafür samt einfacherer Lösung als die unten??

>Auf die Lösung mit dem tif-Header sind wir auch schon gekommen, aber das dauert
>halt seine Zeit...Und was ist "gdiplus von MS "?

"Graphics Device Interface plus" - "Nachfolgerin" der gdi32-Windows-Api. Wenn Du viel mit Bildern arbeitst lohnt sich die IMHO sowieso mal....

Eine ziemlich vollständige Übersetzung der c-Headerdatei für VB gibt's zB bei:
http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=37 541&lngWId=1
Aus der dortigen zip-Datei müßtest Du einfach die Datei "GDIPlus API.bas" als neues Modul in AV importieren.

Die GDIplus selbst kriegst Du als redist-Version bei MS, benötigst Du aber nur für Windows-Versionen vor XP, bei XP ist sie schon dabei:
http://www.microsoft.com/downloads/details.aspx?FamilyID=6a63ab9c-df12 -4d41-933c-be590feaa05a&DisplayLang=en

Ein Aufruf in AV zum Auselesen der Bildgröße eines in der TOC selectierten Rasterlayer könnte dann per Button z.B so aussehen:

Private Declare Function GetDC Lib "user32.dll" (ByVal hwnd As Long) As Long
Private Declare Function ReleaseDC Lib "user32.dll" _
(ByVal hwnd As Long, ByVal hdc As Long) As Long

Private Type imgSize
Width As Long
Height As Long
End Type

Private Sub UIButtonControl1_Click()
Dim pdoc As IMxDocument
Dim pmap As IMap
Dim player As ILayer
Dim pRasterLayer As IRasterLayer
Dim i As imgSize

Set pdoc = ThisDocument
Set pmap = pdoc.FocusMap
Set player = pdoc.SelectedLayer
Set pRasterLayer = player
i = fctGetImageSize(pRasterLayer.FilePath)

MsgBox "Bildgröße: " & i.Width & "*" & i.Height & " Pixel"
End Sub


Private Function fctGetImageSize(strImage As String) As imgSize
Dim Token As Long
Dim GpInput As GdiplusStartupInput
Dim graphics As Long
Dim img As Long
Dim hdc As Long

GpInput.GdiplusVersion = 1
GdiplusStartup Token, GpInput

If GdiplusStartup(Token, GpInput) <> [OK] Then
MsgBox "Fehler", vbCritical
Exit Function
End If

hdc = GetDC(Application.hwnd)

Call GdipCreateFromHDC(hdc, graphics)
Call GdipLoadImageFromFile(StrConv(strImage, vbUnicode), img)

Call GdipGetImageWidth(img, fctGetImageSize.Width)
Call GdipGetImageHeight(img, fctGetImageSize.Height)

Call GdipDisposeImage(img)
Call GdipDeleteGraphics(graphics)
ReleaseDC Application.hwnd, hdc

End Function

Anm: die gdiplus arbeitet mit Unicode. Strings mußt Du also via Strconv(str, vbunicode) übergeben s.o.

Viele Grüße
Jörg Ostendorp
Hallo Jörg,
vielen Dank für Deinen tollen Tip, ich werde das die Tage mal ausprobieren.

Viele Grüße zurück
Uli