ArgumentException при загрузке изображения из байтового массива с использованием JpegBitmapDecoder - PullRequest
0 голосов
/ 05 апреля 2011

У меня проблемы с чтением файлов JPEG в моем классе.Мне нужно загрузить метаданные и растровое изображение из файла JPEG.Пока у меня есть следующее:

    public void Load()
    {
        using (Stream imageStream = File.Open(this.FilePath, FileMode.Open, FileAccess.Read, FileShare.Read))
        {
            BitmapDecoder decoder = new JpegBitmapDecoder(imageStream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad);
            BitmapSource source = decoder.Frames[0];

            // load metadata
            this.metadata = source.Metadata as BitmapMetadata;

            // prepare buffer
            int octetsPerPixel = source.Format.BitsPerPixel / 8;
            byte[] pixelBuffer = new byte[source.PixelWidth * source.PixelHeight * octetsPerPixel];
            source.CopyPixels(pixelBuffer, source.PixelWidth * octetsPerPixel, 0);

            Stream pixelStream = new MemoryStream(pixelBuffer);

            // load bitmap
            this.bitmap = new Bitmap(pixelStream); // throws ArgumentException
        }

        this.status = PhotoStatus.Loaded;
    }

Но конструктор Bitmap выдает исключение ArgumentException при попытке создать экземпляр Bitmap из потока.

Документация гласит:

System.ArgumentException

stream не содержит данных изображения или имеет значение null.

-или-

stream содержит файл изображения PNG с одним размером, превышающим 65 535 пикселей.

Я не уверен, что я сделал не так.Можете ли вы помочь мне?

1 Ответ

2 голосов
/ 05 апреля 2011

Вы используете конструктор Bitmap, который обычно используется для загрузки файла изображения в известном формате - JPEG, PNG и т. Д. Вместо этого у вас просто есть куча байтов, и вы этого не говорите что-нибудь о формате, в котором вы хотите их использовать.

Непонятно, почему вы вообще хотите использовать BitmapDecoder и BitmapSource - почему вы просто не используете:

Stream imageStream = File.Open(this.FilePath, FileMode.Open,
                               FileAccess.Read, FileShare.Read));
this.bitmap = new Bitmap(imageStream);

Обратите внимание, что вы не должны использовать здесь оператор using - Bitmap "владеет" потоком после того, как вы вызвали конструктор.

Помимо всехиз этого вы, похоже, пытаетесь смешать идеи образов WPF и WinForms, что, как я подозреваю, вообще плохая идея: (

...