これは 2 つの部分からなる質問です。最初の質問は、メモリ不足にならずに大きな画像をロードする方法 (1) であり、2 番目の質問はロード パフォーマンスの向上 (2) です。
(1) ファイルシステムでギガバイトを消費する巨大な画像を扱うことができる Photoshop のようなアプリケーションを考えてみましょう。画像全体をメモリに保持し、操作 (フィルター、画像処理など、または単にレイヤーを追加するだけでも) を実行するのに十分な空きメモリを保持することは、ほとんどのシステム (8GB x64 システムであっても) では不可能です。
これが、このようなアプリケーションがスワップ ファイルの概念を使用する理由です。内部的には、Photoshop は独自のファイル形式を使用しており、アプリケーションの設計に適しており、スワップからの部分的な読み込みをサポートするように構築されているため、ファイルの一部をメモリに読み込んで処理できると想定しています。
(2) ファイル形式ごとにカスタム ローダーを作成することで、Performande を (かなり) 改善できます。これには、使用するファイル形式のファイル ヘッダーと構造を読む必要があります。慣れればそれほど難しくはありませんが、メソッド呼び出しほど簡単ではありません。
たとえば、FastBitmap をグーグル検索して、ビットマップ (BMP) ファイルを非常に高速にロードする方法の例を確認できます。これには、ビットマップ ヘッダーのデコードが含まれていました。これには pInvoke が含まれており、何に直面しているかについてのアイデアを得るには、次のようなビットマップ構造を定義する必要があります。
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct BITMAPFILEHEADER
{
public Int16 bfType;
public Int32 bfSize;
public Int16 bfReserved1;
public Int16 bfReserved2;
public Int32 bfOffBits;
}
[StructLayout(LayoutKind.Sequential)]
public struct BITMAPINFO
{
public BITMAPINFOHEADER bmiHeader;
public RGBQUAD bmiColors;
}
[StructLayout(LayoutKind.Sequential)]
public struct BITMAPINFOHEADER
{
public uint biSize;
public int biWidth;
public int biHeight;
public ushort biPlanes;
public ushort biBitCount;
public BitmapCompression biCompression;
public uint biSizeImage;
public int biXPelsPerMeter;
public int biYPelsPerMeter;
public uint biClrUsed;
public uint biClrImportant;
}
おそらく、DIB ( http://www.herdsoft.com/ti/davincie/imex3j8i.htm ) の作成と、データがビットマップに「上下逆さま」に格納されているなどの奇妙な点を考慮する必要があります。開くと鏡像になります:-)
これはビットマップ専用です。PNG を実行したい場合は、同様のことを行う必要がありますが、PNG ヘッダーをデコードする必要があります。これは、最も単純な形式ではそれほど難しくありませんが、完全な PNG 仕様のサポートを取得したい場合は、楽しい乗り物になります:- )
PNG は、異なるデータを見つけるために検索できる「ヘッダー」を持つチャンク ベースの形式を使用するため、ビットマップとは異なります。フォーマットで遊んでいるときに使用したいくつかのチャンクの例は
string[] chunks =
new string[] {"?PNG", "IHDR","PLTE","IDAT","IEND","tRNS",
"cHRM","gAMA","iCCP","sBIT","sRGB","tEXt","zTXt","iTXt",
"bKGD","hIST","pHYs","sPLT","tIME"};
また、PNG ファイルの Adler32 チェックサムについても学習する必要があります。したがって、実行したいファイル形式ごとに、さまざまな課題が追加されます。
返信でもっと完全なソースコードの例を提供できればいいのにと思いますが、それは複雑な問題であり、正直に言うと、自分でスワップを実装したことがないので、それについてあまり堅実なアドバイスをすることはできません.
簡単に言えば、BCL の画像処理能力はそれほど高くないということです。中程度の答えは、誰かがあなたに役立つ画像ライブラリを作成したかどうかを試して見つけることであり、長い答えは、袖を抜いてアプリケーションのコアを自分で作成することです.
あなたは実生活で私を知っているので、どこで私を見つけるか知っています;)