C # “Parâmetro não é válido.” Criando novo bitmap

se eu tentar criar um bitmap maior que 19000 px eu recebo o erro: O parâmetro não é válido. Como posso resolver isso?

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

    Tenha em mente que é uma grande quantidade de memory que você está tentando alocar com esse Bitmap.

    Consulte http://social.msdn.microsoft.com/Forums/pt-BR/netfxbcl/thread/37684999-62c7-4c41-8167-745a2b486583/

    É provável que o .NET se recuse a criar uma imagem que consuma muita memory contígua de uma só vez.

    Um pouco mais difícil de ler, mas essa referência também ajuda:

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

    Cada imagem no sistema tem a quantidade de memory definida por esta fórmula:

    bit-depth * width * height / 8

    Isso significa que uma imagem 40800 pixels por 4050 exigirá mais de 660 megabytes de memory.

    Eu suspeito que você está atingindo problemas de limite de memory. No entanto, há muitos motivos pelos quais um construtor de bitmap pode falhar. Os principais são listados neste artigo da Base de Dados de Conhecimento falando sobre limites GDI + em CreateBitmap . System.Drawing.Bitmap , internamente, usa a API nativa do GDI quando o bitmap é construído.

    Dito isto, um bitmap desse tamanho está bem acima de um GB de RAM, e é provável que você esteja atingindo a limitação do tamanho da linha de varredura (64KB) ou esteja ficando sem memory.

    19000 pixels quadrados, a 32bpp, exigiriam 11552000000 bits (1,37 GB) para armazenar o raster na memory. Isso é apenas os dados brutos dos pixels; qualquer sobrecarga adicional inerente ao System.Drawing.Bitmap seria adicionada a isso. Subir para 20k pixels quadrados na mesma profundidade de cor exigiria 1,5 GB apenas para a memory bruta de pixels. Em um único object, você está usando 3/4 do espaço reservado para o aplicativo inteiro em um ambiente de 32 bits. Um ambiente de 64 bits tem limites mais soltos (geralmente), mas você ainda está usando 3/4 do tamanho máximo de um único object.

    Por que você precisa de um tamanho de imagem tão colossal? Visto em 1280×1024 res em um monitor de computador, uma imagem de 19000 pixels em um lado seria de 14 canvass de largura por 18 canvass de altura. Eu só posso imaginar que você está fazendo charts de alta qualidade, neste caso, uma imagem de 720 dpi seria um pôster quadrado de 26 pol.

    Defina o PixelFormat quando você novo um bitmap, como:

     new Bitmap(2000, 40000,PixelFormat.Format16bppRgb555) 

    e com o número exato acima, funciona para mim. Isso pode resolver parcialmente o problema.

    Obteve este erro ao abrir um arquivo TIF. O problema foi devido a não conseguir abrir o CMYK. Alterou o espaço de colors de RGB para CMYK e não recebeu um erro.

    Então usei a biblioteca taglib para obter o tamanho do arquivo de imagem.

    Amostra de código:

     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 (""); } }