1

画像 (pdf および Word ドキュメント) をメモリ ストリームから読み込んで、pdf に追加する前に操作できるようにしようとしています。ビットマップまたは GIF を読み込もうとすると、恐ろしい GDI+ エラーが発生します。

この呼び出し...

System.Drawing.Bitmap myImage = System.Drawing.Image.FromStream(docStream);  

このエラーを生成します...

System.Runtime.InteropServices.ExternalException occurred
  Message="A generic error occurred in GDI+."
  Source="System.Drawing"
  ErrorCode=-2147467259
  StackTrace:
       at System.Drawing.Image.FromStream(Stream stream, Boolean useEmbeddedColorManagement, Boolean validateImageData)
       at System.Drawing.Image.FromStream(Stream stream)  

そしてこの呼びかけ…

System.Drawing.Bitmap myImage = new System.Drawing.Bitmap(docStream);

このエラーを生成します...

System.ArgumentException occurred
  Message="Parameter is not valid."
  Source="System.Drawing"
  StackTrace:
       at System.Drawing.Bitmap..ctor(Stream stream)

このコードは png、jpg、tif では機能しますが、bmp や GIF では機能しません。

基本的には次のとおりです。

MemoryStream docStream = GetMemoryStream(filePath);
// The next line errors...
System.Drawing.Bitmap myImage = new System.Drawing.Bitmap(docStream);

    private MemoryStream GetMemoryStream(string file)
    {
        FileStream fs = null;
        Byte[] bytes;
        int len;

        fs = File.OpenRead(file);
        len = (int)fs.Length - 1;
        bytes = new Byte[len];
        fs.Read(bytes, 0, len);

        return new MemoryStream(bytes);

    }

私はどこでもMemoryStreamを閉じていません.pngとjpgが閉じられたMemoryStreamの影響を受けない限り、それは問題ではないと思います. Hex エディタを使用して画像ファイルを見ると、エンコーディングが間違っているようには見えません。念のため、さまざまなファイルサイズも試しました。

この時点で、私はかなり途方に暮れています。どんな助けでも大歓迎です。

ありがとう。

4

2 に答える 2

3
    len = (int)fs.Length - 1;

VBでプログラミングするために使用された、それが良いアイデアだと思った理由がわかりませんか?-1を削除します。すべてのバイトから最後のバイトを引いたものではなく、すべてのバイトを読み取ります。File.ReadAllBytes()が適切な選択です。

于 2010-10-12T23:23:32.317 に答える
2

Readがバッファをいっぱいにするという保証はありません。単にいくつかのデータを返す必要があります。より一般的なアプローチは次のとおりです。

byte[] buffer = new byte[2048];
int read;
while((read = source.Read(buffer, 0, buffer.Length)) > 0) {
    memStream.Write(buffer, 0, read);
}
memStream.Position = 0; //rewind to read it
于 2010-10-12T23:33:36.327 に答える