Как сохранить изображение с помощью 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 из вашего элемента управления изображения