Подтвердить что ты не робот

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

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

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

Ответ 1

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

См. 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 мегабайт памяти.

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

new Bitmap(2000, 40000,PixelFormat.Format16bppRgb555)

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

Ответ 5

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