Я пытаюсь нарисовать масштабированное изображение внутри круга с помощью Win2D в С #, и мне это не удается.
Например, мои попытки:
CanvasBitmap image;
bool resourcesLoaded = false;
public Other() {
this.InitializeComponent();
}
void canvasControl_Draw(CanvasControl sender, CanvasDrawEventArgs args) {
if( resourcesLoaded ) {
var halfWidth = sender.ActualWidth / 2;
var halfHeight = sender.ActualHeight / 2;
double displayScaling = DisplayInformation.GetForCurrentView().LogicalDpi / 96.0;
double pixelWidth = halfWidth * displayScaling;
double pixelHeight = halfHeight * displayScaling;
var scaleEffect = new ScaleEffect() {
Source = image,
Scale = new Vector2() {
X = ( float ) ( pixelHeight / image.Size.Height ),
Y = ( float ) ( pixelHeight / image.Size.Height ),
}
};
var blurEffect = new GaussianBlurEffect() {
Source = scaleEffect,
BlurAmount = 5f
};
args.DrawingSession.FillCircle( new System.Numerics.Vector2() { X = ( float ) halfWidth, Y = (float) halfHeight },
(float) halfHeight/2,
new CanvasImageBrush( sender, blurEffect ) {
SourceRectangle = new Rect(0,0, scaleEffect.GetBounds(sender).Width, scaleEffect.GetBounds( sender ).Height)
} );
}
}
private void canvasControl_CreateResources(CanvasControl sender, Microsoft.Graphics.Canvas.UI.CanvasCreateResourcesEventArgs args) {
args.TrackAsyncAction( CreateResources( sender ).AsAsyncAction() );
}
private async Task CreateResources(CanvasControl sender) {
image = await CanvasBitmap.LoadAsync( canvasControl, new Uri( "ms-appx:///Imgs/test.jpg" ) );
resourcesLoaded = true;
sender.Invalidate();
}
И что происходит, так это то, что изображение кажется нарисованным в позиции X = 0 и Y = 0 окна (холст использует все окно), поэтому мой круг находится в середине окна, тогда только часть изображения нарисована и я хотел, чтобы мое изображение было помещено в центр круга.
Итак, вопросы: - Правильно ли поставлена моя шкала? зачем делить на 96? я могу прочитать это из системы? - можно ли размыть только края изображения? - а как нарисовать свое изображение в центре круга?
Спасибо