C # "Параметр недействителен." создание нового растрового изображения - PullRequest
29 голосов
/ 13 июня 2011

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

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

Ответы [ 5 ]

33 голосов
/ 13 июня 2011

Помните, что это МНОГО памяти, которую вы пытаетесь выделить этим растровым изображением.

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

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

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

http://www.tech -archive.net / Архив / DotNet / microsoft.public.dotnet.framework.drawing / 2005-06 / msg00176.html

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

bit-depth * width * height / 8

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

8 голосов
/ 13 июня 2011
Для

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

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

6 голосов
/ 13 июня 2011

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

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

4 голосов
/ 01 апреля 2017

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

new Bitmap(2000, 40000,PixelFormat.Format16bppRgb555)

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

0 голосов
/ 09 февраля 2016

Получил эту ошибку при открытии файла 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 ("");
    }
}
...