3


0

私は自分のスマートフォン用の地図ソフトウェアを書いていて、一部分だけが表示されるときにすべての(大きな)画像ファイルをメモリにロードしたくないという問題を抱えています。

あなたがxとyのオフセットと幅を知っているならば、大きい画像の小区分(見える部分)だけを読む方法はありますか? 私はおそらく一度に1バイトずつファイルを読むことによってそれをすることができることを知っているが、私はこれをする方法がわからない。

ありがとう、ニコ

5 Answer


2


画像がどの形式で保存されているかに少なくとも部分的に依存します。 生の画像ファイルやビットマップがある場合、それは可能かもしれませんが、もしあなたのデータがJPEGやPNGのような何らかの方法で圧縮されているならば、サブセクションだけを読むことははるかに困難になるでしょう。


1


完全なデータをメモリにロードしたくない場合は、ファイルを読み取る独自のIOルーチンを作成する必要があります。 BMPよりも複雑なものでは、解凍アルゴリズムが複雑になる可能性があります。


1


画像をあらかじめいくつかのセクションに分割してもらえませんか。

256 x 256ピクセルの画像に分割すると、それらをいくつかロードして、表示可能なキャンバスに貼り付けるだけで済みます。 1つの実装に名前をつけるために - グーグルマップはこのテクニックを使います。


1


BMPファイルの場合は、それほど難しいことではありません。

最初に44バイトだと思い出した場合は、まずファイルからヘッダーを読み取りますが、Webから仕様を検索することでそれを見つけることができます。

ヘッダには、ピクセルあたりのバイト数、幅と高さの合計、スキャンラインあたりのバイト数などの情報が含まれます。 通常、ビットマップは上下逆さまに格納されているので、ファイルの一番下の行の最初のピクセルがどこにあるかを計算し、その場所にスキップします。 次に、その行から必要なピクセルを読み取り、次の行の正しいピクセルにスキップします。

FileStream`クラスはあなたが必要とするものを持っています。読み込みのための `Read`メソッドと、指定された位置にスキップするための Seek`メソッド。


0


これは私がビットマップでやったことです…​

public BitmapCropBitmap(BitMap fullBitmap、Rectangle Rectangular){return proBitmap.clone(fullBitmap、Rectangle、fullBitmap.PixelFormat); }