web-dev-qa-db-ja.com

C#「パラメーターが無効です。」新しいビットマップの作成

19000 pxより大きいビットマップを作成しようとすると、エラーが発生します:パラメーターが無効です。これを回避するにはどうすればよいですか?

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

そのビットマップで割り当てようとしているメモリが大量にあることに注意してください。

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

つまり、4050 x 4050の画像には660メガバイト以上のメモリが必要です。

33
Zhais

32bppの19000ピクセルの正方形では、メモリにラスターを格納するために11552000000ビット(1.37 GB)が必要です。それは単なる生のピクセルデータです。 System.Drawing.Bitmapに固有の追加オーバーヘッドはそれを追加します。同じ色深度で最大20kピクセルの正方形にすると、生のピクセルメモリだけで1.5GBが必要になります。単一のオブジェクトでは、32ビット環境でアプリケーション全体に予約されているスペースの3/4を使用しています。 64ビット環境では(通常)より緩やかな制限がありますが、1つのオブジェクトの最大サイズの3/4を使用しています。

なぜこのような巨大な画像サイズが必要なのですか?コンピューターモニターで1280x1024の解像度で表示すると、横19000ピクセルの画像は幅14画面、高さ18画面になります。高品質の印刷グラフィックスを作成しているとしか想像できません。その場合、720dpiの画像は26インチの正方形のポスターになります。

8
KeithS

メモリキャップの問題が発生していると思われます。ただし、ビットマップコンストラクターが失敗する理由は多数あります。主なものは このナレッジベース記事CreateBitmapのGDI +制限について説明しています。 System.Drawing.Bitmapは、内部的に、ビットマップの構築時にGDIネイティブAPIを使用します。

そうは言っても、そのサイズのビットマップはGBのRAMをはるかに超えており、スキャンラインサイズの制限(64 KB)に達しているか、メモリが不足している可能性があります。

6
Reed Copsey

次のように、ビットマップを新規作成するときにPixelFormatを設定します。

new Bitmap(2000, 40000,PixelFormat.Format16bppRgb555)

上記の正確な数で、それは私のために機能します。これにより、問題が部分的に解決される場合があります。

5
RainZhang

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