Проекты разработки неизбежно потерпят неудачу, если команде программистов не будет предоставлено полное полномочие принимать все решения, связанные с используемой технологией.
Хорошо, я, кажется, нашел причину просто по счастливой случайности, и в этом конкретном методе нет ничего плохого, он создает резервную копию стека вызовов.
Ранее я изменял размер изображения и как часть этого метода я возвращаю объект с измененным размером следующим образом. Я вставил два вызова вышеупомянутого метода и прямое сохранение в файл.
// 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-тип был правильным для всех объекты изображения, поскольку в противном случае это затрудняет написание универсального кода обработки.
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?
Имела очень похожую проблему, а также пыталась клонировать изображение, которое не работает. Я обнаружил, что лучшим решением было создание нового объекта Bitmap из образа, который загружался из потока памяти. Таким образом, поток может быть утилизирован, например,
using (var m = new MemoryStream())
{
var img = new Bitmap(Image.FromStream(m));
return img;
}
Надеюсь, это поможет.
.