2016-07-22 28 views
1

Ich habe es geschafft, die x,y,height,width des Bereichs zu erhalten, die ich aus der Zeichnung auf der InkCanvas zuschneiden muss. aber ich bin nicht in der Lage, die richtige Lösung zu finden, um diesen Bereich zu beschneiden und als Bild zu speichern.Crop inkCanvas Zeichnung aus einem bestimmten Bereich, Windows Universal App

Edit: ist hier die ganze Geschichte: entwickelte ich eine Zeichenanwendung vor einem Jahr für Windows Phone 8.1 Silverlight. Dieses Beispiel mit

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

Jetzt versuche ich, die gleiche Sache mit einigen unterschiedlichen Funktionalitäten für Witwen universal zu machen. Ich entwickle es von Grund auf neu, weil jetzt Tinte in Win10 verfügbar ist plus ich kann den alten Code nicht verwenden, da er InkPresenter enthält, der nur für Silverlight-Anwendungen verfügbar ist.

Hier ist der Code, den ich für das Zuschneiden der Fläche letztes Mal verwendet (dies ist nicht mein eigener Code ist, habe ich es online)

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; 
    } 

Aber jetzt heißt es

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

bei source.Pixels und source.Pixels und ich weiß nicht, wie ich es beheben soll.

Ich habe diese Frage gepostet in der Hoffnung, dass es einen direkten Weg geben muss, den InkCanvas-Bereich zu beschneiden, da es jetzt ein Teil von win10 ist.

Edit 2 @Jay die Breite und Höhe, die ich in Parametern bin vorbei ist die Breite und Höhe des Bereichs, die ich in Bezug auf die x- und y-zuschneiden möge. Ich probierte das Debugging, um den Wert von decoder.PixelWidth und height zu überprüfen. es ist immer dasselbe wie die Breite und Höhe, die ich in den Params zur Verfügung stelle.

so jetzt, wenn xoffset =185 und yoffset=100 und die height und width in dem params ist 50 und 60. die decoder.PixelWidth und decoder.PixelHeight werden auch die gleichen wie params sein. das ist, was die, wenn die Bedingung wie

sieht

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

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

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

daher diese Bedingung immer wahr ist. Wo gehe ich falsch?

Ich hoffe, ich habe keine Tippfehler in dieser Bearbeitung gemacht.

+0

Was haben Sie bisher versucht? – AVK

+0

@AVKNaidu lesen Sie bitte den Bearbeitungs – saira

Antwort

0

Wie Sie wissen, unterscheidet sich die InkCanvas in UWP von der in Windows Phone 8.1 Silverlight. Informationen zur Verwendung von InkCanvas in UWP finden Sie unter Pen and stylus interactions in UWP apps.

Zum Ausschneiden von InkCanvas-Zeichnungen aus einem bestimmten Bereich können wir die Tintenstriche zunächst mit IInkStrokeContainer.SaveAsync method speichern und dann das Bild mit BitmapTransform class zuschneiden. Zum Beispiel:

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; 
    } 
} 
+0

Es geht immer in diesem Zustand und den Wert null zurück 'if (Pixelwidth> decoder.PixelWidth - xOffset || pixelHeight> decoder.PixelHeight - yOffset) { return null; } ' – saira

+0

@saira Die Größe der gespeicherten Tintenstriche entspricht nicht der Größe des InkCanvas, Sie müssen möglicherweise sicherstellen, dass der Beschneidungsbereich kleiner als der Zeichenbereich ist. Sie können 'decoder.PixelWidth' und' decoder.PixelHeight' verwenden, um die Größe der gespeicherten Tintenstriche zu sehen. –

+0

überprüfen Sie bitte die edit2 – saira