BitmapImage METRO повторно использует код WPF

Я написал небольшую игру с использованием IronPython и WPF для дидактических целей, и теперь я хочу перевести проект в Metro APP для тестирования общих проектов.

Код виновного:

def LoadImage(name, sourceRect):
    bmp = BitmapImage()
    bmp.BeginInit()
    bmp.UriSource = Uri("./data/images/" + name, UriKind.Relative)
    bmp.SourceRect = sourceRect
    bmp.EndInit()
    image = Image()
    image.Source = bmp
    return image

Как я могу получить такой же результат в приложении Metro (используя C#)? Должен быть способ сделать это простым способом, как старый BitmapImage. Мне это нужно, потому что у меня есть мозаичные изображения, и я хочу, чтобы часть их отображалась. WriteableBitmap работает, но игнорирует прозрачность изображения, поэтому он бесполезен.


person Alberto Nuti    schedule 19.05.2014    source источник


Ответы (1)


Я использовал этот код для загрузки масштабированного изображения:

    public static async Task SetSourceAsync(
        this WriteableBitmap writeableBitmap,
        IRandomAccessStream streamSource,
        uint decodePixelWidth,
        uint decodePixelHeight)
    {
        var decoder = await BitmapDecoder.CreateAsync(streamSource);

        using (var inMemoryStream = new InMemoryRandomAccessStream())
        {
            var encoder = await BitmapEncoder.CreateForTranscodingAsync(inMemoryStream, decoder);
            encoder.BitmapTransform.ScaledWidth = decodePixelWidth;
            encoder.BitmapTransform.ScaledHeight = decodePixelHeight;
            await encoder.FlushAsync();
            inMemoryStream.Seek(0);

            await writeableBitmap.SetSourceAsync(inMemoryStream);
        }
    }

Вы могли бы использовать что-то подобное, но вы бы указали encoder.BitmapTransform.Bounds вместо ScaledWidth/Height для обрезки. Если есть более конкретные вопросы - уточняйте.

person Filip Skakun    schedule 19.05.2014
comment
Привет, извините за поздний ответ! Вы отвечаете на трюк, но не работает с прозрачным изображением. Это проблема WriteableBitmap, BitmapImage работает... Во всяком случае, я решил разделить исходное изображение. WriteableBitmap не распознает прозрачность, BitmapImage не обрезается и загружается только после отображения элемента изображения, загрузка изображения с использованием потока является асинхронным методом, а мне нужен синхронный... Например, я не могу знать размер BitmapImage (в пикселях) до изображения объявиться. В WPF действительно было проще и элегантнее - person Alberto Nuti; 23.05.2014