Sara Noemi Ответов: 4

"Параметр недопустим". в новом растровом изображении


Я получаю это исключение:

Система.Исключение ArgumentException приходило сообщение="параметр не является допустимым." исходная система.Рисунок" StackTrace: at System.Рисование.Растровое изображение..чтор(ширина типа int32, int32 отсчитываемый высота, PixelFormat формат) в систему.Рисование.Растровое изображение..чтор(ширина типа int32, int32 и высота)...

когда я создаю экземпляр нового растрового изображения таким образом:

Bitmap resImage = new Bitmap(width, height); 
resImage.SetResolution(600, 600);


где ширина и высота-это размеры, преобразованные в пикселях для 600 точек на дюйм размера, установленного пользователем в СМ, что в данном конкретном случае составляет 28х41 см (изображение формата А3), соответствующее 6614х9685 пикселям. После этого я создам графический объект из растрового изображения и нарисую на нем с помощью методов GDI+. Мне нужно изображение с высоким разрешением, потому что оно будет добавлено в pdf-документ, и я хочу получить отличный качественный результат.

Я получаю это исключение как из приложения windows, так и из веб-приложения, но поскольку это непрерывный процесс генерации такого рода растровых изображений, исключение выбрасывается после разного времени повторения в зависимости от типа приложения и размера изображения. В частности, я получаю ошибку после порядка сотых изображений, созданных в приложении windows, и десятых в веб-приложении.

Я уже избавился от всех графических объектов и теперь действительно не знаю, что делать!

Почему я получаю это исключение? Как я могу решить эту проблему?

Заранее спасибо за любую помощь!

johannesnestler

похоже, вы устанавливаете <= 0 в качестве ширины или высоты, проверили ли вы (отладили) фактические значения, когда получаете это исключение?

Sara Noemi

Да, на самом деле эти значения составляют 6614x9685 пикселей; я проверил их при отладке.

johannesnestler

Хм, звучит довольно странно, что вы видите ошибку только иногда, извините, у меня нет другой идеи, чтобы помочь вам в данный момент :-(

Sara Noemi

Похоже, что после нескольких циклов создания растрового изображения возникает проблема переполнения памяти или что-то в этом роде..

4 Ответов

Рейтинг:
2

Mishra Laxmikant

Да, создайте экземпляр bitamp с помощью stream. например.

public static void saveimage(System.IO.Stream InputFileStream, string ImageName, string ImageExtension)
        {

            Bitmap bmpBitMapImage = new Bitmap(InputFileStream, true);}



Я также сталкивался с этой ошибкой так много раз.


Sara Noemi

Но что такое InputFileStream, если у меня нет файла, из которого создается растровое изображение?

Mishra Laxmikant

его не просто
FileUpload file_ = новая загрузка файла();
файл_.PostedFile.Входной поток

Рейтинг:
2

Member 12931920

Дорогой друг!
Вы решили эту проблему?
У меня та же проблема, что и у тебя.
Не могли бы вы сказать мне, как справиться с этой проблемой?
Спасибо!


Рейтинг:
0

OriginalGriff

Проверьте свои значения - я только что попробовал в своем коде:

int width = 6614;
int height = 9685;
Bitmap resImage = new Bitmap(width, height);
resImage.SetResolution(600, 600);
И я не получаю исключения.
Таким образом, скорее всего, значения, которые вы передаете для ширины и высоты, не являются тем, что вы думаете - посмотрите в отладчике и проверьте, какие именно значения пикселей вы передаете конструктору растрового изображения.

Затем один шаг вашего кода - как я уже сказал, он работает здесь.


Sara Noemi

Я абсолютно уверен, что значения верны; на самом деле растровое изображение создается несколько раз, как я уже сказал, и после некоторого цикла создания я получаю ошибку. Вы пробовали этот код только один раз или в повторном цикле?

OriginalGriff

Память.
Это будет классифицироваться как "большой объект" - что означает, что он попадает в кучу больших объектов, а не в обычную кучу, - и это управляется по-разному. Вызываете ли вы вручную Dispose для этих объектов, когда закончите с ними?

Sara Noemi

Я понимаю, что, вероятно, это вопрос памяти. Я называю Dispose эксплицитностью для всех графических объектов, которые я использовал, и поэтому я не могу понять, что не так! Я с ума схожу от этого!

OriginalGriff

Я попробовал это добавить к нажатию кнопки для приложения, над которым я работаю
for (int i = 0; i < 100; i++)
{
int width = 6614;
int height = 9685;
Bitmap resImage = новое растровое изображение(ширина, высота);
ресимаж.SetResolution(600, 600);
}
И он регулярно терпел неудачу после 5 итераций.
Добавление распоряжаться:
for (int i = 0; i < 100; i++)
{
int width = 6614;
int height = 9685;
Bitmap resImage = новое растровое изображение(ширина, высота);
ресимаж.SetResolution(600, 600);
ресимаж.Располагать();
}
И каждый раз он проходил через сотню. Так что же я делаю такого, что отличается от тебя?
(Имейте в виду, что это не "массивное" растровое изображение, хотя оно занимает 250 Мб памяти каждое: я работал с большим размером 15519 x 19988 без проблем, хотя я бы не хотел создавать много таких одновременно! :смеяться: )

Рейтинг:
0

Mishra Laxmikant

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

if (!strmftpdata.CanSeek)
{
}


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


Sara Noemi

Как я могу создать растровое изображение из потока? Я создаю экземпляр этого растрового изображения, а затем создаю из него графику и использую метод GDI+ для рисования на ней. Это не растровое изображение, загруженное из файла.