Как сохранить изображение с помощью JpegBitmapEncoder

В соответствии с примером кодирования изображения здесь я должен быть в состоянии использовать JpegBitmapEncoder для кодирования изображения для сохранения в виде файла JPEG, но получить эту ошибку компиляции:

ошибка CS1503: аргумент 1: невозможно преобразовать файл 'System.Windows.Controls.Image' в 'System.Uri'

Я не вижу способ (свойство или метод в изображении), чтобы получить System.Uri из изображения. Что мне не хватает?

Код XAML изображения

<Image Name="ColorImage"/>

SaveImage C# является

...
SaveImage(ColorImage, path);
...
private void SaveImage(Image image, string path)
{
    var jpegEncoder = new JpegBitmapEncoder();
    jpegEncoder.Frames.Add(BitmapFrame.Create(image));
    using (var fs = new FileStream(path, FileMode.Create, FileAccess.Write))
    {
        jpegEncoder.Save(fs);
    }
}

Приведенный ниже код (взятый в основном из kinect-sdk) передает поток 640 x 480 RBG в WriteableBitmap со скоростью 30 кадров в секунду (kinect ColorImageFormat - RgbResolution640x480Fps30).

using (var colorImageFrame = allFramesReadyEventArgs.OpenColorImageFrame())
{
    if (colorImageFrame == null) return;
    var haveNewFormat = currentColorImageFormat != colorImageFrame.Format;
    if (haveNewFormat)
    {
        currentColorImageFormat = colorImageFrame.Format;
        colorImageData = new byte[colorImageFrame.PixelDataLength];
        colorImageWritableBitmap = new WriteableBitmap(
            colorImageFrame.Width, 
            colorImageFrame.Height, 96, 96, PixelFormats.Bgr32, null);
        ColorImage.Source = colorImageWritableBitmap;
    }
    // Make a copy of the color frame for displaying.
    colorImageFrame.CopyPixelDataTo(colorImageData);
    colorImageWritableBitmap.WritePixels(
        new Int32Rect(0, 0, colorImageFrame.Width, colorImageFrame.Height),
        colorImageData,
        colorImageFrame.Width*Bgr32BytesPerPixel,
        0);
}

3 ответа

Решение
private void SaveImage(string path)
{
    var jpegEncoder = new JpegBitmapEncoder();
    jpegEncoder.Frames.Add(BitmapFrame.Create(colorImageWritableBitmap));
    using (var fs = new FileStream(path, FileMode.Create, FileAccess.Write))
    {
        jpegEncoder.Save(fs);
    }
}

Проблема возникает, потому что вы передаете Image в BitmapFrame.Create, Imageчаще встречается в Windows Forms. Простой подход заключается в создании MemoryStream Первый проход это:

private void SaveImage(Image image, string path)
    {
        MemoryStream ms = new MemoryStream();
        image.Save(ms,System.Drawing.Imaging.ImageFormat.Jpeg);
        var jpegEncoder = new JpegBitmapEncoder();
        jpegEncoder.Frames.Add(BitmapFrame.Create(ms));
        using (var fs = new FileStream(path, FileMode.Create, FileAccess.Write))
        {
            jpegEncoder.Save(fs);
        }
    }

Дополнение (см. Разговор в комментариях):

Вы можете попробовать использовать CopyPixels метод объекта writeableBitmap и скопируйте пиксели в байтовый массив, который вы загружаете в MemoryStream и записать его в файл JPEG с JpegBitmapEncoder, Но это всего лишь предположение.

Это тоже может сработать:

     private void SaveImage (WriteableBitmap img, string path)
     {
         FileStream stream = new FileStream(path, FileMode.Create);
         JpegBitmapEncoder encoder = new JpegBitmapEncoder();
         encoder.Frames.Add(BitmapFrame.Create(img));
         encoder.Save(stream);
         stream.Close();
     }

Вам просто нужно будет извлечь WriteableBitmap из вашего элемента управления изображения

Пытаться: BitmapFrame.Create(image.Source)

Другие вопросы по тегам