2013-07-19 2 views
1

Как вы скопировали часть от одного WriteableBitmap к другому WriteableBitmap? В прошлом я написал и использовал десятки «копий-копий» и прозрачных копий, но я не могу найти эквивалент для WPF C#.Как вы можете скопировать часть writeablebitmap в другую writeablebitmap?

Это либо самый сложный вопрос в мире, либо самый простой, потому что абсолютно никто не касается его десятифутовым столбом.

+1

Вы имеете в виду с 'CopyPixels' /' WritePixels' комбо? – JerKimball

+0

Это работает? Я никогда не видел этого, и я смотрел. Как бы вы это сделали? – zetar

ответ

2

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

3

Используйте WriteableBitmapEx от http://writeablebitmapex.codeplex.com/ Затем используйте метод Blit, как показано ниже.

private WriteableBitmap bSave; 
    private WriteableBitmap bBase; 

    private void test() 
    { 
     bSave = BitmapFactory.New(200, 200); //your destination 
     bBase = BitmapFactory.New(200, 200); //your source 
     //here paint something on either bitmap. 
     Rect rec = new Rect(0, 0, 199, 199); 
     using (bSave.GetBitmapContext()) 
     { 
      using (bBase.GetBitmapContext()) 
      { 
       bSave.Blit(rec, bBase, rec, WriteableBitmapExtensions.BlendMode.Additive); 
      } 
     } 
    } 

вы можете использовать BlendMode.None для повышения производительности, если вам не нужно, чтобы сохранить какую-либо информацию в пункт назначения. При использовании Additive вы получаете альфа-композицию между источником и местом назначения.

1

Я согласен с Гаем выше, что самый простой способ - просто использовать библиотеку WriteableBitmapEx; однако функция Blit предназначена для компоновки переднего и заднего фона. Наиболее эффективный способ для копирования части одного WriteableBitmap другого WriteableBitmap будет использовать функцию Crop:

var DstImg = SrcImg.Crop(new Rect(...)); 

Обратите внимание, что ваш SrcImg WriteableBitmap должен быть в формате Pbgra32 для работы на библиотеке WriteableBitmapEx. Если растровое изображение не в таком виде, то вы можете легко преобразовать его перед обрезкой:

var tmp = BitmapFactory.ConvertToPbgra32Format(SrcImg); 
var DstImg = tmp.Crop(new Rect(...)); 
1
public static void CopyPixelsTo(this BitmapSource sourceImage, Int32Rect sourceRoi, WriteableBitmap destinationImage, Int32Rect destinationRoi) 
    { 
     var croppedBitmap = new CroppedBitmap(sourceImage, sourceRoi); 
     int stride = croppedBitmap.PixelWidth * (croppedBitmap.Format.BitsPerPixel/8); 
     var data = new byte[stride * croppedBitmap.PixelHeight]; 
     // Is it possible to Copy directly from the sourceImage into the destinationImage? 
     croppedBitmap.CopyPixels(data, stride, 0); 
     destinationImage.WritePixels(destinationRoi,data,stride,0); 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^