Открытие файла изображения в WritableBitmap

Вот в чем проблема. Я хочу открыть файл с локальных дисков, а затем преобразовать его в WritableBitmap, чтобы я мог его редактировать. Но проблема в том, что я не могу создать WritableBitmap из Uri или чего-то в этом роде. Также я знаю, как открыть файл в BitmapImage, но не могу понять, как открыть файл как WritableBitmap. Есть ли способ открыть файл непосредственно в WritableBitmap, если нет, есть ли способ преобразовать BitmapImage в WritableBitmap? Спасибо, парни.


person gkaykck    schedule 23.11.2010    source источник
comment
кажется, что мы можем передать растровое изображение прямо в конструктор записываемых битовых карт. Мой VS дал мне ошибки, когда я впервые попробовал, но теперь он, похоже, работает. Это был совсем не хороший вопрос, извините, ребята.   -  person gkaykck    schedule 23.11.2010
comment
Он будет работать, но его размер будет изменен, если он превышает несколько мегапикселей.   -  person Léon Pelletier    schedule 17.04.2013


Ответы (3)


Вы можете загрузить файл изображения в BitmapImage и используйте его как источник для своего WriteableBitmap:

BitmapImage bitmap = new BitmapImage(new Uri("YourImage.jpg", UriKind.Relative));
WriteableBitmap writeableBitmap = new WriteableBitmap(bitmap);
person Frédéric Hamidi    schedule 23.11.2010
comment
На самом деле, в Siverlight это исключение. Так что это не решение - person Peter Lee; 27.12.2012
comment
@Peter, какое исключение вы получите? - person Frédéric Hamidi; 27.12.2012
comment
BitmapImage bi = new BitmapImage(new Uri("header.png", UriKind.Relative)); WriteableBitmap wb = new WriteableBitmap(bi); 2-я линия System.NullReferenceException was unhandled by user code: Object reference not set to an instance of an object. - person Peter Lee; 27.12.2012
comment
@Peter, вы проверили, что bi не null после вызова конструктора BitmapImage? Если это так, вполне логично, что конструктор WriteableBitmap потерпит неудачу. - person Frédéric Hamidi; 27.12.2012
comment
Да, проверял. Смотрите мой ответ. Не могли бы вы протестировать мой код на своей машине? - person Peter Lee; 27.12.2012
comment
Загрузка WriteableBitmap из BitmapImage на самом деле является обходным путем, поскольку окончательное изображение масштабируется в соответствии с ограничениями физического устройства. Таким образом, 5-мегапиксельное изображение можно масштабировать до 1-мегапиксельного изображения. Бесполезно, учитывая, что WriteableBitmap используется для обработки изображений. - person Léon Pelletier; 17.04.2013
comment
@ Питер Ли. Что вы получаете, если для параметра CreateOptions установлено значение None? - person Léon Pelletier; 17.04.2013
comment
@ LéonPelletier Я установил для параметра создания значение Нет, существует ошибка (Silverlight 5). В созданном источнике растрового изображения PixelHeight и PixelWidth равны нулю. - person shalin; 16.07.2015

Я не эксперт и не имею немедленного доступа к intellisense и тому подобному, но вот ...

var fileBytes = File.ReadAllBytes(fileName);
var stream = new MemoryStream(fileBytes);
var bitmap = new BitmapImage(stream);
var writeableBitmap = new WritableBitmap(bitmap);

Даже если это не идеальный пример, этого должно быть достаточно, чтобы указать вам правильное направление. Надеюсь, что так.

person Grant Thomas    schedule 23.11.2010
comment
вы не можете передать растровое изображение непосредственно в записываемое растровое изображение - person gkaykck; 23.11.2010
comment
File.ReadAllBytes(fileName); запрещено в Silverlight, кроме OpenFileDialog - person Peter Lee; 27.12.2012

В Silverlight 5 вы можете использовать метод ниже, чтобы открыть файл с локального диска, преобразовать его в BitmapImage и преобразовать в WriteableBitmap;

        OpenFileDialog dlg = new OpenFileDialog();
        dlg.Multiselect = false;


        dlg.ShowDialog();
        byte[] byteArray = new byte[] { };
        if (dlg.File == null) return;
        BitmapImage bi = new BitmapImage();
        bi.CreateOptions = BitmapCreateOptions.None;
       // bi.UriSource = new Uri(@"C:\Users\saw\Desktop\image.jpg", UriKind.RelativeOrAbsolute);
        bi.SetSource(dlg.File.OpenRead());
        WriteableBitmap eb=new WriteableBitmap(bi);

установка нового Uri дала мне ошибку (ссылка на объект не установлена ​​на экземпляр объекта) при попытке создать WriteableBitmap

person shalin    schedule 16.07.2015