Вам нужно дождаться события ImageOpened, прежде чем вы сможете получить значения ширины / высоты. Это связано с тем, что BitmapImage создается асинхронно при загрузке из URI (даже если файл локальный). Только если вы загружаете его из потока, он создается синхронно.
Еще одна вещь, о которой следует знать, это то, что BitmapImage.CreateOption по умолчанию имеет значение DelayCreation, что означает, что он будет создан только тогда, когда BitmapImage назначен элементу в живом дереве. Вы можете установить CreateOption = None, чтобы изменить это.