ketan Ram Patil Ответов: 1

Как преобразовать croppedbitmap в bitmapimage в WPF VB


пожалуйста помочь..


Заранее спасибо.

Что я уже пробовал:

я не знаю, как преобразовать CroppedBitmap в BitmapImage

1 Ответов

Рейтинг:
8

Graeme_Grant

Если вы посмотрите на ответ на предыдущий вопрос, который вы задали: Как обрезать изображение в WPF VB[^], вы бы видели эту строку:

var img = image1.Source as BitmapSource;

а потом это:
image2.Source = new CroppedBitmap(inputImage, rcFrom);

и в соответствии с Документация Microsoft[^], также связанный в ответах на предыдущий вопрос, имеет следующий комментарий:
Цитата:
В следующем примере создается изображение, использующее в качестве источника CroppedBitmap.

Таким образом, CroppedBitmap фактически возвращает растровый объект BitmapSource тип, который имеет больше информации, которую вы просите в вопросе выше: Класс BitmapSource - документация Microsoft[^] с примерами.

Обновление №1

Расширяясь выше (CroppedBitmap.Source возвращает BitmapSource введите), и используя решение вашего предыдущего вопроса, а также поиск google & используя найденную статью в C# - объект bitmapsource в объект bitmapimage - переполнение стека[^], ответ был бы там, если бы вы немного поработали, как я только что сделал.

Вот рабочее решение, которое дает вам выбор кодировки изображения (Jpg или Png):
private void Go_Click(object sender, RoutedEventArgs e)
{
    if (image1.Source != null)
    {
        var rect1 = new Rect()
        {
            X = Canvas.GetLeft(selectionRectangle),
            Y = Canvas.GetTop(selectionRectangle),
            Width = selectionRectangle.Width,
            Height = selectionRectangle.Height
        };

        // calc scale in PIXEls for CroppedBitmap...
        var img = image1.Source as BitmapSource;
        var scaleWidth = (img.PixelWidth) / (image1.ActualWidth);
        var scaleHeight = (img.PixelHeight) / (image1.ActualHeight);

        var rcFrom = new Int32Rect()
        {
            X = (int)(rect1.X * scaleWidth),
            Y = (int)(rect1.Y * scaleHeight),
            Width = (int)(rect1.Width * scaleWidth),
            Height = (int)(rect1.Height * scaleHeight)
        };

        var cropped = new CroppedBitmap(inputImage, rcFrom);

        // UPDATE HERE: CroppedBitmap to BitmapImage
        croppedImage = GetJpgImage(cropped.Source);
        // or 
        // croppedImage = GetPngImage(cropped.Source);

        // using BitmapImage version to prove its created successfully
        image2.Source = croppedImage; //cropped;
    }
}

private BitmapImage croppedImage;

private BitmapImage GetJpgImage(BitmapSource source)
{
    return GetImage(source, new JpegBitmapEncoder());
}

private BitmapImage GetPngImage(BitmapSource source)
{
    return GetImage(source, new PngBitmapEncoder());
}

private BitmapImage GetImage(BitmapSource source, BitmapEncoder encoder)
{
    var bmpImage = new BitmapImage();

    using (var srcMS = new MemoryStream())
    {
        encoder.Frames.Add(BitmapFrame.Create(source));
        encoder.Save(srcMS);

        srcMS.Position = 0;
        using (var destMS = new MemoryStream(srcMS.ToArray()))
        {
            bmpImage.BeginInit();
            bmpImage.StreamSource = destMS;
            bmpImage.CacheOption = BitmapCacheOption.OnLoad;
            bmpImage.EndInit();
            bmpImage.Freeze();
        }
    }

    return bmpImage;
}


Обновление №2 Как уже упоминалось ниже, Вот как сэкономить...
private void Save_Click(object sender, RoutedEventArgs e)
{
    // save to current working directory
    SaveJpgImage(croppedImage, @".\cropped.jpg");

}

private void SaveJpgImage(BitmapImage source, string photoLocation)
{
    SaveImage(source, photoLocation, new JpegBitmapEncoder());
}

private void SavePngImage(BitmapImage source, string photoLocation)
{
    SaveImage(source, photoLocation, new PngBitmapEncoder());
}

private void SaveImage(BitmapImage source, string photoLocation, BitmapEncoder encoder)
{
    encoder.Frames.Add(BitmapFrame.Create(source));

    using (var filestream = new FileStream(photoLocation, FileMode.Create))
        encoder.Save(filestream);
}


Обновление №3

Просто заметил тег VB - извините за это... Версия VB ниже...
Imports System.IO

Class MainWindow

    Private isDragging As Boolean
    Private anchorPoint As New Point()

    Public Sub New()

        InitializeComponent()

        inputImage = New BitmapImage(New Uri("pack://application:,,,/Images/Code Project Sample_300 dpi.JPEG"))
        'inputImage = new BitmapImage(new Uri("http://eskipaper.com/images/cool-morning-fog-wallpaper-1.jpg"));
        image1.Source = inputImage

        Go.IsEnabled = False
        image2.Source = Nothing

    End Sub

    Private ReadOnly Property inputImage As BitmapImage

    Private Sub Go_Click(sender As Object, e As RoutedEventArgs)

        If image1.Source IsNot Nothing Then

            Dim rect1 = New Rect() With {
                    .X = Canvas.GetLeft(selectionRectangle),
                    .Y = Canvas.GetTop(selectionRectangle),
                    .Width = selectionRectangle.Width,
                    .Height = selectionRectangle.Height
                }

            ' calc scale in PIXEls for CroppedBitmap...
            Dim img = TryCast(image1.Source, BitmapSource)
            Dim scaleWidth = (img.PixelWidth) / (image1.ActualWidth)
            Dim scaleHeight = (img.PixelHeight) / (image1.ActualHeight)

            Dim rcFrom = New Int32Rect() With {
                    .X = CInt(rect1.X * scaleWidth),
                    .Y = CInt(rect1.Y * scaleHeight),
                    .Width = CInt(rect1.Width * scaleWidth),
                    .Height = CInt(rect1.Height * scaleHeight)
                }

            Dim cropped = New CroppedBitmap(inputImage, rcFrom)
            croppedImage = GetJpgImage(cropped)

            ' using BitmapImage version to prove its created successfully
            image2.Source = croppedImage 'cropped

        End If

    End Sub

    Private croppedImage As BitmapImage

    Private Function GetJpgImage(source As BitmapSource) As BitmapImage

        Return GetImage(source, New JpegBitmapEncoder())

    End Function

    Private Function GetPngImage(source As BitmapSource) As BitmapImage

        Return GetImage(source, New PngBitmapEncoder())

    End Function

    Private Function GetImage(source As BitmapSource, encoder As BitmapEncoder) As BitmapImage

        Dim bmpImage = New BitmapImage()

        Using srcMS = New MemoryStream()

            encoder.Frames.Add(BitmapFrame.Create(source))
            encoder.Save(srcMS)

            srcMS.Position = 0
            Using destMS = New MemoryStream(srcMS.ToArray())
                bmpImage.BeginInit()
                bmpImage.StreamSource = destMS
                bmpImage.CacheOption = BitmapCacheOption.OnLoad
                bmpImage.EndInit()
                bmpImage.Freeze()
            End Using

        End Using

        Return bmpImage

    End Function

#Region "Mouse events"
 
    Private Sub image1_MouseLeftButtonDown(sender As Object, e As MouseButtonEventArgs)

        If Not isDragging Then
            anchorPoint.X = e.GetPosition(BackPanel).X
            anchorPoint.Y = e.GetPosition(BackPanel).Y
            isDragging = True
        End If

    End Sub

    Private Sub image1_MouseMove(sender As Object, e As MouseEventArgs)

        If isDragging Then

            Dim x As Double = e.GetPosition(BackPanel).X
            Dim y As Double = e.GetPosition(BackPanel).Y

            selectionRectangle.SetValue(Canvas.LeftProperty, Math.Min(x, anchorPoint.X))
            selectionRectangle.SetValue(Canvas.TopProperty, Math.Min(y, anchorPoint.Y))
            selectionRectangle.Width = Math.Abs(x - anchorPoint.X)
            selectionRectangle.Height = Math.Abs(y - anchorPoint.Y)

            If selectionRectangle.Visibility <> Visibility.Visible Then
                selectionRectangle.Visibility = Visibility.Visible
            End If

        End If

    End Sub

    Private Sub image1_MouseLeftButtonUp(sender As Object, e As MouseButtonEventArgs)

        If isDragging Then

            isDragging = False

            If selectionRectangle.Width > 0 Then
                Go.Visibility = Visibility.Visible
                Go.IsEnabled = True
            End If

            If selectionRectangle.Visibility <> Visibility.Visible Then
                selectionRectangle.Visibility = Visibility.Visible
            End If

        End If

    End Sub

    Private Sub RestRect()

        selectionRectangle.Visibility = Visibility.Collapsed
        isDragging = False

    End Sub

#End Region

    Private Sub Save_Click(sender As Object, e A


ketan Ram Patil

:(
сначала я преобразую CroppedBitmap в bitmapsource, а затем bitmapsource в bitmap, а затем bitmap в bitmapimage, который он успешно преобразует.

но когда я преобразую растровое изображение в байт, это дает ошибку

Невозможно привести объект типа ' System.Окна.Средства массовой информации.Изображений.Система CroppedBitmap' to type'.Окна.Средства массовой информации.Изображений.Растровое изображение".

ketan Ram Patil

спасибо за ваш ценный повтор.. :)

в приведенном выше коде обрезанный объект передает croppedbitmap источнику image2. я хочу передать только растровое изображение.

когда я пассирую объект croppedImage в источник image2, он отображает пустое изображение.:(

Graeme_Grant

Как оказалось, я пропустил один шаг с созданием BitmapImage - мне нужно было установить свойство CacheOption. Я обновлю решение + я добавил сохранить в файл, который, без сомнения, будет вашим следующим вопросом.

ketan Ram Patil

еще раз спасибо.. :)
хорошего вам дня... :)
Он отлично работает.

Graeme_Grant

Добро пожаловать. :)

shubh2895

спасибо за код обрезки ... он работает....

пожалуйста помочь

я застрял на проблеме яркости изображения в wpf с помощью ползунка управления.

я попытался передать значения этой функции, но она выдает ошибку

"ссылка на объект не установлена на экземпляр объекта"
Общие функции яркости(изображения бывал как растровое изображение, SliderValue бывал как целое) Как Растровое Изображение

'DrawImage(изображение, GetBrightnessMatrix (процент))

Dim brtR As Single = CSng(SliderValue / 100)
Dim brtG As Single = CSng(SliderValue / 100)
Dim brtB As Single = CSng(SliderValue / 100)
Dim image_attr как новые атрибуты ImageAttributes
Дим см в подразделениях компании = Новый подразделениях компании(новый сингл()() _
{ _
New Single () {brtR, 0.0, 0.0, 0.0, 0.0}, _
New Single () {0.0, brtG, 0.0, 0.0, 0.0}, _
New Single () {0.0, 0.0, brtB, 0.0, 0.0}, _
Новый Сингл() {0.0, 0.0, 0.0, 1.0, 0.0}, _
Новый Сингл() {0.0, 0.0, 0.0, 0.0, 1.0}})

Тусклый прямоугольник как прямоугольник = _
Прямоугольник.Круглые(рис.Метод Getbounds(GraphicsUnit.Пиксель))
Дим ужр как целое число, = изображения.Ширина
Dim hgt как целое число = изображение.Высота

Дим img В качестве нового растрового изображения(ужр, хагат)
Dim gr As Graphics = графика.FromImage(img)

image_attr.SetColorMatrix (см)
гр.Функция drawImage(изображения, прямоугольник, 0, 0, ужр, _
хагат, GraphicsUnit.Пиксель, image_attr)

Возврат img


Конечная Функция


Private Sub SliderBrightness_ValueChanged(ByVal sender As System.Объект, бывал е как система.Окна.RoutedPropertyChangedEventArgs(Of System.Двойной)) Ручки SliderBrightness.ValueChanged

Если образ1.Источник Ничего Не Значит


Dim i как целое число
i = Слайдербрайтность.Ценность
StackPanelImage.Source = ToBitmapImage (яркость (bitmapimage, i))
Конец, Если
Конец Подводной Лодки

Graeme_Grant

Это другой вопрос, поэтому, пожалуйста, начните новый.

shubh2895

ОК :)

https://www.codeproject.com/Questions/1201941/HOW-to-brightness-image-in-WPF-VB-using-slider-con

shubh2895

ПОЖАЛУЙСТА

ПОМОГИ МНЕ....
я начинаю с нового вопроса.

ketan Ram Patil

загрузите новый вопрос. вы определенно получите решение. не теряйте надежды.
оставайся счастливой.... :)

Graeme_Grant

Нашел для него одну в интернете...

shubh2895

Graeme_Grant, Пожалуйста, Помогите.
я так близок к ответу.

Graeme_Grant

Я нашел для вас ссылку, и она работает, так что попробуйте: Решение 1[^]