4

プログラムに問題があります。byte[]SQL Serverデータベースから読み取り、これをJPEGイメージとして保存します。

while (reader1.Read())
{
    picBytes = null;
    picBytes = (byte[])reader1.GetValue(0);
    if (picBytes != null)
    {
        try
        {
            ms = new MemoryStream(picBytes, 0, picBytes.Length);
            returnImage = Image.FromStream(ms, true);
            returnImage.Save(@"path" + array[2] + ".jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
            returnImage.Dispose();
            ms.Dispose();
        }
        catch (Exception e)
        {
            Console.WriteLine(e + array[2] + ".jpg");
        }
    }
}

99%に権限エラーがあることを読みましたが、500枚の画像が正しく作成され、50枚は正しく作成されていません。

そして、このエラーはWindows 764ビットでのみスローされます...XPでは問題はありません:

Error in System.Drawing.Image.Save(String filename, ImageCodecInfo encoder, EncoderParameters encoderParams)
4

3 に答える 3

2

同じ問題を抱えている人はまだ数人いるので、ここで私が問題を解決する方法:

  • スクリューシステム。図面

使用する

  • File.WriteAllBytes(pathString、picBytes);
于 2014-07-31T07:41:24.793 に答える
1

私は同様の問題を抱えていました。同じコードがほとんどの画像で機能し、一部の画像でエラーが発生しました。回避策として、ロードされた画像からビットマップを作成し、ビットマップを保存すると、すべての画像で機能することがわかりました。あなたの場合、これは次のことを意味します:

using(var bmp=new Bitmap(returnImage))
  bmp.Save(@"path" + array[2] + ".jpg", System.Drawing.Imaging.ImageFormat.Jpeg);

なぜこれが機能するのかわからないので、さらに詳しい情報に興味があります。

編集:さらに調査したところ、問題は(少なくとも私の場合は)画像のEXIFデータにあるようです。EXIFブロックの長さが0xEFFFより大きい場合(つまり、最初のバイトが0xFFの場合)、画像を保存できません。したがって、ファイルの先頭からEXIFブロックを削除すると、問題も解決します。

于 2013-03-27T13:55:10.877 に答える
0

インストールしたプログラムを実行したときにこのエラーが表示されましたが、VisualStudioデバッガーで実行したときは表示されませんでした。エラーコード0x80004005は、許可エラーを示します。特定の状況では、Windows 7はXPよりも読み取り/書き込み権限に特化していると思いますが、Windows10は間違いなくより制限が厳しいです。プログラムを管理者として実行することで、問題を解決することができました。ただし、これは配布する予定のプログラムにとっては悪い習慣なので、コードを調べたところ、Windows10で保護されているプログラムフォルダーに一時emfファイルを書き込もうとしていることがわかりました。そのプログラムの保護されていないProgramDataフォルダー、またはできればSystem.IO.Path.GetTempPathを使用して一時ファイルのデフォルトのパス名を取得します。メモリストリームを使用することは、さらに優れたソリューションです。

于 2020-05-14T12:32:22.603 に答える