Почему код был циклом навсегда?
Типичный float
может точно представлять около 2 32 sup> чисел, 0.1
не является одним из них. Так что код больше похож.
float f = 1.0;
while (f != 0.0) {
f = f - a_number_close_to_one_tenth;
printf("%.1f\n", f);
}
Повторные вычитания "пропустить" 0,0.
Вместо этого используйте >=
, и код будет повторять ожидаемое количество раз (или, может быть, еще раз). Используйте печать с более высокой точностью, чтобы понять почему.
float f = 1.0;
while (f >= 0.0) {
f = f - a_number_close_to_one_tenth;
printf("%.17e\n", f);
}
Я предполагаю, что что-то идет не так, как надо при получении файла из сервера. Возможно, Вы только получаете часть файла прежде, чем попытаться преобразовать его в Image
? Вы уверены, что это - тот же самый массив байтов, Вы подаете приложение C++?
Попытайтесь сохранить поток в файл и посмотрите то, что Вы получаете. Вы смогли раскрывать некоторые подсказки там.
Можно также добавить точку останова и вручную сравнить некоторые байты в массиве байтов к тому, что они, как предполагается, (если Вы знаете это).
Править: Похоже, что нет ничего неправильно с получением данных. Проблема состоит в том, что это находится в формате .raw (не формат это Image.FromStream
понимает). Bitmap(Int32, Int32, Int32, PixelFormat, IntPtr)
конструктор может быть полезным здесь. Или, можно создать пустой битовый массив и с беконом, салатом и помидорами это вручную от необработанных данных.
System.InvalidArgument
означает, что поток не имеет допустимого формата изображения, т.е. типа изображения, который не поддерживается.
У меня была та же проблема в прошлом, и это было вызвано утечкой в библиотеках окон GDI, которая является тем, что использует 'Битовый массив'. Если этот случай все время для Вас затем его, вероятно, не связанный, как бы то ни было.
У меня возникла эта проблема, когда я делал это:
MemoryStream stream = new MemoryStream();
screenshot.Save(stream, ImageFormat.Png);
byte[] bytes = new byte[stream.Length];
stream.Save(bytes, 0, steam.Length);
Проблема заключалась в последних 2 строках. Я исправил это, выполнив следующие действия:
MemoryStream stream = new MemoryStream();
screenshot.Save(stream, ImageFormat.Png);
byte[] bytes = stream.ToArray();
А затем это сработало:
MemoryStream stream = new MemoryStream(bytes);
var newImage = System.Drawing.Image.FromStream(stream);
stream.Dispose();
Может быть, изображение встроен в поле OLE, и вы должны учитывать 88 байт заголовок OLE PLUS PLAY нагрузки:
byteBlobData = (Byte[]) reader.GetValue(0);
stream = new MemoryStream(byteBlobData, 88, byteBlobData.Length - 88);
img = Image.FromStream(stream);