Alexander
Alexander

Reputation: 441

Silverlight: How to copy region from WriteableBitmap / BitmapImage?

I have such code for Bitmap wrapper. I need to create overload constructor which cut some rectangle from source image and put it inside _wbmp.

Smth similar to public Bitmap(string fileName, Rectangle area). Please share some solution.

public Bitmap(string fileName)
    {
        Uri uri = new Uri(fileName, UriKind.RelativeOrAbsolute);

        StreamResourceInfo sri = null;
        sri = Application.GetResourceStream(uri);

        // Create a new WriteableBitmap object and set it to the JPEG stream.
        BitmapImage bitmap = new BitmapImage();
        bitmap.CreateOptions = BitmapCreateOptions.None;
        bitmap.SetSource(sri.Stream);
        _wbmp = new WriteableBitmap(bitmap);
    }

Thank you

Upvotes: 0

Views: 345

Answers (1)

Julio Garcia
Julio Garcia

Reputation: 1954

The WritableBitmap object has a Render method that you can use to render a new bitmap after adding some transformation. In your case you could create and new WritableBitmap with the correct new size to set the button-right corner and then add temporary image with your source and translate it to the left to set the upper left corner. Something like this:

 public static WriteableBitmap CropBitmap(string fileName, int newTop, int newRight, int newBottom, int newLeft)
    {
        Uri uri = new Uri(fileName, UriKind.RelativeOrAbsolute);

        StreamResourceInfo sri = null;
        sri = Application.GetResourceStream(uri);

        // Create a new WriteableBitmap object and set it to the JPEG stream.
        BitmapImage bitmapImage = new BitmapImage();
        bitmapImage.CreateOptions = BitmapCreateOptions.None;
        bitmapImage.SetSource(sri.Stream);

        //calculate bounding box
        int originalWidth = bitmapImage.PixelWidth;
        int originalHeight = bitmapImage.PixelHeight;

        int newSmallWidth = newRight - newLeft;
        int newSmallHeight = newBottom - newTop;

        //generate temporary control to render image
        Image temporaryImage = new Image { Source = bitmapImage, Width = originalWidth, Height = originalHeight };

        //create writeablebitmap
        WriteableBitmap wb = new WriteableBitmap(newSmallWidth, newSmallHeight);


        wb.Render(temporaryImage, new TranslateTransform { X = -newLeft, Y = -newTop });
        wb.Invalidate();

        return wb;
    }

Upvotes: 1

Related Questions