Универсальная ошибка произошла в GDI +, Изображение JPEG к MemoryStream

Проекты разработки неизбежно потерпят неудачу, если команде программистов не будет предоставлено полное полномочие принимать все решения, связанные с используемой технологией.

314
задан Cœur 19 February 2017 в 01:44
поделиться

3 ответа

Хорошо, я, кажется, нашел причину просто по счастливой случайности, и в этом конкретном методе нет ничего плохого, он создает резервную копию стека вызовов.

Ранее я изменял размер изображения и как часть этого метода я возвращаю объект с измененным размером следующим образом. Я вставил два вызова вышеупомянутого метода и прямое сохранение в файл.

// At this point the new bitmap has no MimeType
// Need to output to memory stream
using (var m = new MemoryStream())
{
       dst.Save(m, format);

       var img = Image.FromStream(m);

       //TEST
       img.Save("C:\\test.jpg");
       var bytes = PhotoEditor.ConvertImageToByteArray(img);


       return img;
 }

Похоже, что поток памяти, в котором был создан объект , имеет , который должен быть открыт во время сохранения объекта. Я не уверен, почему это так. Может ли кто-нибудь просветить меня и как я могу это обойти.

Я возвращаюсь только из потока, потому что после использования кода изменения размера, подобного , этот целевой файл имеет неизвестный MIME-тип (img.RawFormat.Guid), и мне хотелось бы, чтобы Mime-тип был правильным для всех объекты изображения, поскольку в противном случае это затрудняет написание универсального кода обработки.

178
ответ дан 23 November 2019 в 01:08
поделиться

I notice that your "jpeg" case is actually:

            default:
                format = ImageFormat.Jpeg;
                break;

Are you sure that the format is jpeg and not something else?

I'd try:

            case "image/jpg": // or "image/jpeg" !
                format = ImageFormat.Jpeg;
                break;

Or check what imageToConvert.MimeType() is actually returning.

UPDATE

Is there any other initialisation you need to do to the MemoryStream object?

2
ответ дан 23 November 2019 в 01:08
поделиться

Имела очень похожую проблему, а также пыталась клонировать изображение, которое не работает. Я обнаружил, что лучшим решением было создание нового объекта Bitmap из образа, который загружался из потока памяти. Таким образом, поток может быть утилизирован, например,

using (var m = new MemoryStream())
{
    var img = new Bitmap(Image.FromStream(m));
    return img;
}

Надеюсь, это поможет.

.
9
ответ дан 23 November 2019 в 01:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: