C # «Параметр недействителен». Создание нового растрового изображения

если я попытаюсь создать bitmap размером более 19000 пикселей, я получу ошибку: параметр недействителен. Как я могу обойти это?

System.Drawing.Bitmap myimage= new System.Drawing.Bitmap(20000, 20000); 

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

См. http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/37684999-62c7-4c41-8167-745a2b486583/

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

Чуть труднее читать, но эта ссылка также помогает:

http://www.tech-archive.net/Archive/DotNet/microsoft.public.dotnet.framework.drawing/2005-06/msg00176.html

Каждое изображение в системе имеет объем памяти, определенный этой формулой:

bit-depth * width * height / 8

Это означает, что для изображения 40800 пикселей на 4050 потребуется более 660 мегабайт памяти.

Я подозреваю, что у вас проблемы с памятью. Однако есть много причин, по которым конструктор bitmap может выйти из строя. Основные из них перечислены в этой статье базы знаний, посвященной ограничениям GDI + в CreateBitmap . System.Drawing.Bitmap , внутренне, использует собственный API GDI при построении растрового изображения.

При этом bitmap такого размера намного превышает ГБ ОЗУ, и вполне вероятно, что вы либо нажмете ограничение размера строки сканирования (64 КБ), либо закончите работу.

Квадрат 19000 пикселей, на 32bpp, потребует 11552000000 бит (1,37 ГБ) для хранения растра в памяти. Это всего лишь исходные данные пикселей; любые дополнительные накладные расходы, присущие System.Drawing.Bitmap, будут добавлены к этому. Достигая квадрата 20 кв. Пикселей с той же глубиной цвета, требуется 1,5 ГБ только для необработанной памяти пикселей. В одном объекте вы используете 3/4 пространства, зарезервированного для всего приложения в 32-разрядной среде. 64-разрядная среда имеет более низкие ограничения (обычно), но вы все еще используете 3/4 максимального размера одного объекта.

Зачем вам нужен такой колоссальный размер изображения? При просмотре 1280×1024 точек на мониторе компьютера изображение размером 19000 пикселей будет шириной 14 экранов на 18 экранов. Я могу только представить, что вы делаете высококачественную графику печати, и в этом случае изображение 720 точек на дюйм будет 26-дюймовым квадратным плакатом.

Установите PixelFormat при новом растровом изображении, например:

 new Bitmap(2000, 40000,PixelFormat.Format16bppRgb555) 

и с точным номером выше, это работает для меня. Это может частично решить проблему.

Получил эту ошибку при открытии файла TIF. Проблема заключалась в том, что он не смог открыть CMYK. Изменено цветовое пространство от RGB до CMYK и не получило ошибку.

Поэтому я использовал библиотеку taglib для получения размера файла изображения.

Пример кода:

 try { var image = new System.Drawing.Bitmap(filePath); return string.Format("{0}px by {1}px", image.Width, image.Height); } catch (Exception) { try { TagLib.File file = TagLib.File.Create(filePath); return string.Format("{0}px by {1}px", file.Properties.PhotoWidth, file.Properties.PhotoHeight); } catch (Exception) { return (""); } } 
Давайте будем гением компьютера.