Заменить изображение на обрезанный BitmapSource - PullRequest
0 голосов
/ 27 января 2012

У меня есть изображение на моем контроле wpf и я пытаюсь создать обрезанную часть этого - это нормально более или менее. Я использовал решение codeproject для генерации BitmapSource обрезанного изображения (http://www.codeproject.com/KB/WPF/CropAdorner.aspx), но когда я пытаюсь заменить текущее изображение сгенерированным BitmapSource, как это

imgCurrent.Source = generatedBitmapSource; 

вижу очень странное поведение (( Мне нужен совет, как изменить текущее изображение с новым на основе BitmapSource.

мой XAML (в этом нет ничего необычного - и щелчком правой кнопки мыши я пытаюсь заменить currentImage на обрезанный):

<DockPanel Height="395" Width="926">
    <!--Went with a DockPanel here so that the image would always be centered in its parent control.-->
    <Image x:Name="imgCurrent" VerticalAlignment="Center" HorizontalAlignment="Center" MouseRightButtonDown="imgCurrent_MouseRightButtonDown"/>
</DockPanel> 

клик правой кнопкой мыши:

  private void imgCurrent_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
    { 
           generatedBitmapSource = _clp.BpsCrop();
           //this clears croping adonder
           AdornerLayer aly = AdornerLayer.GetAdornerLayer(_felCur);
           aly.Remove(_clp);
    //
       imageCurrent.Source = generatedBitmapSource;
    }

метод обрезки (из codeproject):

public BitmapSource BpsCrop()
        {
            Thickness margin = AdornerMargin();
            Rect rcInterior = _prCropMask.RectInterior;

            Point pxFromSize = UnitsToPx(rcInterior.Width, rcInterior.Height);

            // It appears that CroppedBitmap indexes from the upper left of the margin whereas RenderTargetBitmap renders the
            // control exclusive of the margin.  Hence our need to take the margins into account here...

            Point pxFromPos = UnitsToPx(rcInterior.Left + margin.Left, rcInterior.Top + margin.Top);
            Point pxWhole = UnitsToPx(AdornedElement.RenderSize.Width + margin.Left, AdornedElement.RenderSize.Height + margin.Left);
            pxFromSize.X = Math.Max(Math.Min(pxWhole.X - pxFromPos.X, pxFromSize.X), 0);
            pxFromSize.Y = Math.Max(Math.Min(pxWhole.Y - pxFromPos.Y, pxFromSize.Y), 0);
            if (pxFromSize.X == 0 || pxFromSize.Y == 0)
            {
                return null;
            }
            System.Windows.Int32Rect rcFrom = new System.Windows.Int32Rect(pxFromPos.X, pxFromPos.Y, pxFromSize.X, pxFromSize.Y);

            RenderTargetBitmap rtb = new RenderTargetBitmap(pxWhole.X, pxWhole.Y, s_dpiX, s_dpiY, PixelFormats.Default);
            rtb.Render(AdornedElement);
            return new CroppedBitmap(rtb, rcFrom);
        }

1 Ответ

0 голосов
/ 27 января 2012

Вы уверены, что у вас нет проблем с вашим "BitmapSource обрезанного изображения"?Можете ли вы в целях тестирования заменить его другим действительным растровым изображением и попробовать, если он работает.Если он работает с другим, но не с «BitmapSource обрезанного изображения», возможно, у вас возникла проблема с созданием «BitmapSource обрезанного изображения».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...