1

ファイルを使用してアセンブリに画像を埋め込んでい.resxます。実行時に、画像をスタンドアロン ファイルに保存して、元のコンテンツを復元する必要があります。System.Drawing.Bitmapインスタンスから元のファイル ストリームを抽出するにはどうすればよいですか? を使用してストリームを作成できることはわかっていますBitmap.Save()が、これにより、PNG を PNG として保存し直した場合でも、画像がトランスコードされます (実際には膨張します)。

それとも、そもそものResourceようにそれらを読んでいるのが私の間違いですか?Bitmap

4

5 に答える 5

2

はい、Bitmapオブジェクトとして読み取った後は、元のファイル ストリームを取得することはできません。オブジェクトには、元のBitmapデータではなく、圧縮されていないデータのみが含まれます。

リソースをバイトデータとして読み取る必要があります。リソース ストリームから読み取り、ファイルに書き込むことができます。

using (Stream source = this.GetType().Assembly.GetManifestResourceStream("WindowsApplication1.filename.jpg")) {
  using (FileStream dest = File.Create(fileName)) {
    byte[] buffer = new byte[4096];
    while (true) {
      int len = source.Read(buffer, 0, buffer.Length);
      if (len == 0) break;
      dest.Write(buffer, 0, len);
    }
  }
}

注: これには、マネージドリソースではなく、埋め込みリソースとして画像を追加する必要があります。を使用して、そこからを作成できます。ImageImage.FromStream()

于 2010-04-28T15:28:57.130 に答える
2

問題がわかりません。PNG は損失のない形式であるため、まったく同じ画像が返されます。はい、Save() を実行したときに必ずしもまったく同じバイトが得られるとは限りません。これは圧縮形式であり、圧縮と速度の最適なバランスを得るためにコンプレッサーが費やす時間は同じではない可能性があります。しかし、だから何?

それが実際の問題である場合は、イメージを管理対象リソースとして追加しないでください。これを埋め込みリソースとしてプロジェクトに追加し、Assembly.GetManifestResourceStream() を使用してメタデータから読み取ることができます。生の画像ファイルのバイトを取得します。Image.FromStream() で画像に変換可能。

于 2010-04-28T16:48:30.467 に答える
1

アプリケーションで実際に をBitmap表示目的で使用していない場合 (つまり、リソースをビットマップとして抽出してファイルとして保存できるようにしている場合)、最も簡単な方法は、リソースを として取得してStream保存することです。それをファイルに。

このチュートリアルでは、リソースをストリームとして取得する方法を示します。

http://devhood.com/Tutorials/tutorial_details.aspx?tutorial_id=75

サンプルでは、​​作成者がストリームを取得してBitmap.FromStreamメソッドに渡します。代わりに行うことは、そのストリームをファイルに直接保存することです (Bitmap完全にバイパスします)。

于 2010-04-28T15:28:01.960 に答える
0

問題はマネージド リソースの使用にあることが判明しました。resx ビルダーは画像ファイルからBitmapオブジェクトを作成し、それらのオブジェクトをシリアル化します。元のファイル ストリームは保存されません。ただし、埋め込みリソースはフラット バイナリ ファイルを格納できます。

次の.csprojエントリを使用して、画像フォルダーからすべてのファイルを埋め込みます。

<EmbeddedResource Include="Images\*.jpg" />
<EmbeddedResource Include="Images\*.png" />
<EmbeddedResource Include="Images\*.gif" />

Visual Studio は、それらを にBuild Action設定された通常のプロジェクト内ファイルとして表示しますEmbedded Resource

次に、私のコードから、元のファイル ストリームを次のように読み込みます。

var assembly = GetType().Assembly;
var regex = new Regex("\\.(png|jpg|gif))$");
foreach (var bitmap in assembly.GetManifestResourceNames())
{
  if(!regex.IsMatch(bitmap)
    continue;

  var stream = assembly.GetManifestResourceStream(bitmap);
  //handle the stream here
}
于 2010-04-29T07:26:34.703 に答える