2013-07-09 4 views
1

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

error CS1503: Argument 1: cannot convert from 'System.Windows.Controls.Image' to 'System.Uri'

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

Код изображения XAML является

<Image Name="ColorImage"/> 

SaveImage С #

... 
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 х 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); 
} 
+0

Смотрите это [JpegBitmapEncoder] (http://stackoverflow.com/questions/13844074/jpegbitmapencoder-leaves-gray-streak-at-end-of-file) –

+0

@Dumitru Chirutac: Уже сделал. JpegBitmapEncoder связан в исходном сообщении. – jacknad

ответ

1
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); 
    } 
} 
0

Try: BitmapFrame.Create(image.Source)

+0

Я думаю, что это поможет только с изображениями, считываемыми из хранилища, а не для изображений, которые были созданы динамически. Он также мог пропустить путь к изображению ;-) –

+0

@jlew: сначала пробовал 'BitmapFrame.Create (image.Source)' first. Он создает ту же ошибку компилятора. – jacknad

2

Проблема возникает, потому что вы передаете 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 из элемента управления Image

+0

По-видимому, для 'Image' не существует определения' Save' или метода 'Save'. Жалоба компилятора: «ошибка CS1061:« System.Windows.Controls.Image »не содержит определения для« Сохранить »и не используется метод расширения« Сохранить », принимающий первый аргумент типа« System.Windows.Controls.Image » быть найденным – jacknad

+0

Я получил это неправильно. Я говорил, что вы говорили о «System.Drawing.Image» –

+0

Как вы устанавливаете изображение и откуда его взяли? –

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