2

巨大な画像 (9000x9000 ピクセルの画像など) を Bitmap オブジェクトにロードしようとすると、メモリ不足エラー、「パラメーターが無効です」エラー、およびその他の関連する問題が発生する可能性があります。

ディスクから 9000x9000 ピクセルのイメージをロードし、最終的にディスクに保存する前にサイズを変更し、致命的なエラー (メモリ不足など) を発生させずにするにはどうすればよいですか?

2 GB の RAM、C# 4.0 を備えた 32 ビット環境を想定し、jpg、gif、bmp、tif、png の画像形式を処理します。

次の 3 つのスニペットを試しましたが、いずれもメモリ エラーで失敗します。

試行 1:

using (Bitmap srcImg = new Bitmap(@"C:\9000x9000.jpg"))
{
    // boom
}

試行 2:

using (Image srcImg = Image.FromFile(@"C:\9000x9000.jpg"))
{
    // kapow
}

試行 3:

using (FileStream fs = new FileStream(@"C:\9000x9000.jpg", FileMode.Open, FileAccess.Read))
{
    using (Image srcImg = Image.FromStream(fs))
    {
        // kelly clarkson
    }
}

可能な解決策についての私の考えは、画像ファイルを配列に直接ロードし(Bitmapオブジェクトの巨大なオーバーヘッドがないため)、その配列を使用してサイズを小さくすることです(おそらく、異なる画像フォーマットヘッダー用にコーディングする必要がありますか? )、最終的に管理可能なサイズの Bitmap オブジェクトに変換する前に。

考えや解決策はありますか?

4

2 に答える 2

1

大きなファイルの処理に適していると思われるAForge.Net ライブラリをご覧ください。

于 2012-11-18T21:21:53.660 に答える
0

これを機能させるために私が従った手順は次のとおりです。

1. http://www.opennetcf.org/PermaLink.aspx?guid=d57ace50-2762-4b19-b07d-39421829d410にアクセスし、Download the SDF 2.0 Beta1 Redistributables をダウンロードします。インストール。

2.PPC 2003 SE デバイスを対象とする VS.NET 2005 でスマート デバイス プロジェクトを作成します。プロジェクトを右クリックして [アップグレード] を選択し、.NET CF 1.1 SP3 ではなく .NET CF v2.0 をターゲットにしていることを確認する必要がありました。

3. OpenNETCF.dll および OpenNETCF.Drawing.dll ファイルを、デフォルトのインストール ディレクトリ (C:\Program Files\OpenNETCF\Smart Device Framework 2.0) からの参照として追加しました。

4.フォームが読み込まれたときに画像を読み込む、フォーム上のピクチャボックスを備えた単純なアプリを作成しました。関連するコードは次のとおりです。一部は Alex Feinman の Web ログからコピーされています。

#region Using directives
using System;
using System.Drawing;
using System.Collections;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using OpenNETCF.Drawing.Imaging;
using System.IO;
#endregion

....

const string szFileName = @"\Storage Card\TEMP\2MBJPEG.JPG";



private void Form1_Load(object sender, EventArgs e)
{
IBitmapImage imageBitmap;
FileStream fsImage;
fsImage = new FileStream(
    szFileName,
    FileMode.Open);
imageBitmap = CreateThumbnail(
    fsImage,
    new Size(100, 100));

Bitmap bm = ImageUtils.IBitmapImageToBitmap(
    imageBitmap);
pictureBox1.Image = bm;
}


static public IBitmapImage CreateThumbnail(Stream stream, Size size)
{
IBitmapImage imageBitmap;
ImageInfo ii;
IImage image;
ImagingFactory factory = new ImagingFactoryClass();
    factory.CreateImageFromStream(
    new StreamOnFile(stream), 
    out image);
image.GetImageInfo(out ii);
factory.CreateBitmapFromImage(
    image, 
    (uint)size.Width, 
    (uint)size.Height,
    ii.PixelFormat, 
    InterpolationHint.InterpolationHintDefault, 
    out imageBitmap);
    return imageBitmap;
}
于 2013-05-21T12:12:57.577 に答える