Наложение изображений поверх другого - PullRequest
2 голосов
/ 14 июня 2011

Я пытаюсь нарисовать белый прямоугольник (100 x 200), а посередине разместить уменьшенное изображение (50 x 75), чтобы оно выглядело как задняя часть игральной карты.

С помощью следующего кода я получаю только плитки с рамкой вокруг них, но без изображения.

        //generate temporary control to render image
        Image temporaryImage = new Image { Source = emptyTileWatermark, Width = destWidth, Height = destHeight };

        //create writeableBitmap
        WriteableBitmap wb = new WriteableBitmap(outputWidth, outputHeight);
        wb.Clear(Colors.White);

        // Closed green polyline with P1(0, 0), P2(outputWidth, 0), P3(outputWidth, outputHeight) and P4(0, outputHeight)
        var outline = new int[] { 0, 0, outputWidth, 0, outputWidth, outputHeight, 0, outputHeight, 0, 0};
        wb.DrawPolyline(outline, Colors.Black);
        wb.Invalidate();
        wb.Render(temporaryImage, new TranslateTransform { X = destX, Y = destY });
        wb.Invalidate();

Я должен указать, что для выполнения .Clear () я использую проект WriteableBitmapEx.

Есть идеи ???

Ответы [ 2 ]

2 голосов
/ 14 июня 2011

В вашем временном изображении не было выполнено его макет, поэтому при рендеринге он все еще остается пустым.Чтобы исправить это, вы должны вызывать Measure and Arrange, это не всегда надежно, но оборачивая его в Border и измеряя и упорядочивая, что, похоже, сработало.

Все это сказано, поскольку вы уже используете WriteableBitmapExвместо этого можно использовать метод Blit.

WriteableBitmap emptyTile = new WriteableBitmap(emptyTileWatermark);
//create writeableBitmap
WriteableBitmap wb = new WriteableBitmap(outputWidth, outputHeight);
wb.Clear(Colors.White);

// Closed green polyline with P1(0, 0), P2(outputWidth, 0), P3(outputWidth, outputHeight) and P4(0, outputHeight)
var outline = new int[] { 0, 0, outputWidth, 0, outputWidth, outputHeight, 0, outputHeight, 0, 0};
wb.DrawPolyline(outline, Colors.Black);
wb.Blit(new Rect(destX,destY,destWidth,destHeight),emptyTile,new Rect(0,0,emptyTileWatermark.PixelWidth,emptyTileWatermark.PixelHeight));
0 голосов
/ 14 июня 2011

Я не эксперт по обработке изображений, но похоже, что функция Blit будет полезна в этом случае.Вместо того, чтобы пытаться визуализировать temporaryImage, создайте новый WriteableBitmap с вашим emptyTileWatermark в качестве источника.Используйте этот WriteableBItmap в качестве параметра Source и wb в качестве параметра Dest и поменяйте два WriteableBitmaps.(Функция Blit поставляется с WriteableBitmapEx).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...