Обрезать рисунок inkCanvas из определенной области, универсальное приложение для Windows

Мне удалось получить x,y,height,width области, которую мне нужно обрезать, из рисунка на inkCanvas. но я не могу найти правильное решение, чтобы обрезать эту область и сохранить ее как изображение.

Редактировать: вот вся история: год назад я разработал приложение для рисования для Windows Phone 8.1 Silverlight. используя этот пример

http://bsubramanyamraju.blogspot.com/2014/03/windows-phone-ink-supportsignature.html

Теперь я пытаюсь сделать то же самое с некоторыми другими функциями для универсальной вдовы. Я разрабатываю его с нуля, потому что теперь рукописный ввод доступен в win10, плюс я не могу использовать старый код, так как он содержит InkPresenter, который доступен только для приложений Silverlight.

Вот код, который я использовал для обрезки области в прошлый раз (это не мой собственный код, я нашел его в Интернете)

static WriteableBitmap CropImage(WriteableBitmap source,
                                                           int xOffset, int yOffset,
                                                           int width, int height)
    {
        // Get the width of the source image
        var sourceWidth = source.PixelWidth;

        // Get the resultant image as WriteableBitmap with specified size
        var result = new WriteableBitmap(width, height);

        // Create the array of bytes
        for (var x = 0; x <= height - 1; x++)
        {
            var sourceIndex = xOffset + (yOffset + x) * sourceWidth;
            var destinationIndex = x * width;

            Array.Copy(source.Pixels, sourceIndex, result.Pixels, destinationIndex, width);
        }
        return result;
    }

Но теперь он говорит

'WriteableBitmap' does not contain a definition for 'Pixels' 

на source.Pixels и source.Pixels и я не знаю, как это исправить.

Я разместил этот вопрос, надеясь, что должен быть прямой способ обрезать область InkCanvas, поскольку теперь она является частью win10.

Редактировать 2 @Jay ширина и высота, которые я передаю в параметрах, — это ширина и высота области, которую я хочу обрезать, относительно x и y. Я попытался отладить, чтобы проверить значение decoder.PixelWidth и height. это всегда то же самое, что и ширина и высота, которые я указываю в параметрах.

так что теперь, если xoffset =185 и yoffset=100 и height и width в параметрах будут 50 и 60. decoder.PixelWidth и decoder.PixelHeight также будут такими же, как параметры. так выглядит условие if

if (pixelWidth > decoder.PixelWidth - xOffset || pixelHeight > decoder.PixelHeight - yOffset)

if (60> 60 - 185 || 50> 50- 100)

if (60> -125 || 50> -50)

поэтому это условие всегда истинно. где я ошибаюсь?

надеюсь, я не сделал никаких опечаток в этом редактировании.


person saira    schedule 22.07.2016    source источник
comment
Что вы пробовали до сих пор?   -  person AVK    schedule 23.07.2016
comment
@AVKNaidu, пожалуйста, ознакомьтесь с правкой   -  person saira    schedule 23.07.2016


Ответы (1)


Как вы знаете, InkCanvas в UWP отличается от того, что используется в Windows Phone 8.1 Silverlight. Чтобы узнать, как использовать InkCanvas в UWP, см. Pen и взаимодействие со стилусом в приложениях UWP.

Чтобы обрезать рисунок inkCanvas из определенной области, мы можем сохранить штрихи пера с помощью метода IInkStrokeContainer.SaveAsync, а затем обрежьте изображение с помощью класса BitmapTransform. Например:

public static async System.Threading.Tasks.Task<WriteableBitmap> CropImageAsync(InkCanvas source, int xOffset, int yOffset, int pixelWidth, int pixelHeight)
{
    if (source.InkPresenter.StrokeContainer.GetStrokes().Count > 0)
    {
        using (var memStream = new InMemoryRandomAccessStream())
        {
            await source.InkPresenter.StrokeContainer.SaveAsync(memStream);

            BitmapDecoder decoder = await BitmapDecoder.CreateAsync(memStream);

            //pixelWidth and pixelHeight must less than the available pixel width and height
            if (pixelWidth > decoder.PixelWidth - xOffset || pixelHeight > decoder.PixelHeight - yOffset)
            {
                return null;
            }

            BitmapTransform transform = new BitmapTransform();
            BitmapBounds bounds = new BitmapBounds();
            bounds.X = (uint)xOffset;
            bounds.Y = (uint)yOffset;
            bounds.Width = (uint)pixelWidth;
            bounds.Height = (uint)pixelHeight;
            transform.Bounds = bounds;

            // Get the cropped pixels within the bounds of transform.
            PixelDataProvider pix = await decoder.GetPixelDataAsync(
                BitmapPixelFormat.Bgra8, // WriteableBitmap uses BGRA format
                BitmapAlphaMode.Straight,
                transform,
                ExifOrientationMode.IgnoreExifOrientation,
                ColorManagementMode.DoNotColorManage);

            byte[] pixels = pix.DetachPixelData();

            var cropBmp = new WriteableBitmap(pixelWidth, pixelHeight);

            // Stream the bytes into a WriteableBitmap
            using (Stream stream = cropBmp.PixelBuffer.AsStream())
            {
                await stream.WriteAsync(pixels, 0, pixels.Length);
            }

            return cropBmp;
        }
    }
    else
    {
        return null;
    }
}
person Jay Zuo    schedule 28.07.2016
comment
Он всегда входит в это условие и возвращает null if (pixelWidth > decoder.PixelWidth - xOffset || pixelHeight > decoder.PixelHeight - yOffset) { return null; } - person saira; 28.07.2016
comment
@saira Размер сохраненных рукописных штрихов не совпадает с размером InkCanvas, вам может потребоваться убедиться, что область обрезки меньше области рисования. Вы можете использовать decoder.PixelWidth и decoder.PixelHeight, чтобы увидеть размер сохраненных росчерков пера. - person Jay Zuo; 29.07.2016
comment
@saira Как вы установили xoffset и yoffset? Размер сохраненных рукописных штрихов совпадает с размером области, нарисованной пользователем, а не с размером InkCanvas. Таким образом, xoffset и yoffset не могут быть установлены в соответствии с InkCanvas. Например, если мы хотим обрезать целые штрихи тушью, нам нужно установить xoffset и yoffset на 0. - person Jay Zuo; 01.08.2016