0

なぜ私がやろうとしていることをしなければならないのかを説明しようとすると、時間がかかりますが、基本的には次のとおりです。ユーザーが Jpeg ファイルを選択するための FileUpload コントロールがあり、アップロードを行い、その後、そのファイルをバイトに変換し、それをイメージ コントロールのソースとして使用します。

私のコードはこれです:

string fileName = Server.MapPath("~/TempImages") + @"\foto.jpg";
fileUpload1.SaveAs(fileName);

System.IO.FileStream fs = new System.IO.FileStream(fileName, System.IO.FileMode.Open, System.IO.FileAccess.Read);
System.IO.BinaryReader binaryReader = new System.IO.BinaryReader(fs);
long byteLength = new System.IO.FileInfo(fileName).Length;
byte[] buffer = binaryReader.ReadBytes((Int32)byteLength);
fs.Close();
fs.Dispose();

string valor = System.Text.Encoding.UTF8.GetString(buffer);
img.ImageUrl = "data:image/jpg;base64," + valor;

バイト配列は問題ないように見えますが、それを文字列に変換すると、認識されない文字でいっぱいです。同じことを行う別のページがありますが、ファイルからバイトを取得する代わりに、MySql データベースから取得し、同じものを使用しますSystem.Text.Encoding.UTF8.GetString問題なく動作します。

更新 尋ねられたように、これは MySql データベースから取得するときに使用するコードです。

DataView dv = (DataView)SqlDataSource3.Select(DataSourceSelectArguments.Empty);
byte[] buffer = (byte[])dv.Table.Rows[0]["BIN_FOTO"];
string valor = System.Text.Encoding.UTF8.GetString(buffer);
img.ImageUrl = "data:image/jpg;base64," + valor;

この SqlDataSource3 の選択は単純Select BIN_FOTO from temp_imageです。この値を Web カメラ キャプチャ WPF プログラムからデータベースに保存します。Web カメラがキャプチャした画像を変換するために使用するコードは次のとおりです。

    private string ImageToBase64String(System.Drawing.Image imageData, ImageFormat format)
    {
        string base64;
        MemoryStream memory = new MemoryStream();
        imageData.Save(memory, format);
        base64 = System.Convert.ToBase64String(memory.ToArray());
        memory.Close();
        memory.Dispose();

        return base64;
    }

base64次に、変数をデータベースに保存します。

これで私の問題が明確になることを願っています

4

3 に答える 3

2

したがって、画像ファイルを読み取り、base 64 に変換します。コードを読み取った後、次のようにします。

string valor = Convert.ToBase64String(buffer);

次のコード行を使用して、画像をバイトとしてファイルに保存しているため、元のコードに欠陥がありました。

fileUpload1.SaveAs(fileName);

これはbase64で保存されていないので、読んだらbase64に変換する必要があります。データが保存される前にbase64に変換されたため、MySqlの読み取りは機能しました。

ちなみに、BinaryReaderこのコードでは は必要ありません。

System.IO.FileStream fs = new System.IO.FileStream(fileName, System.IO.FileMode.Open, System.IO.FileAccess.Read);
System.IO.BinaryReader binaryReader = new System.IO.BinaryReader(fs);
long byteLength = new System.IO.FileInfo(fileName).Length;
byte[] buffer = binaryReader.ReadBytes((Int32)byteLength);
fs.Close();
fs.Dispose();

代わりにこれを書くことができます:

byte[] buffer;
using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read)
{
    long byteLength = fs.Length;
    buffer = new byte[byteLength];
    int bytesRead = fs.Read(buffer, 0, byteLength);
    // optional error check to see that you got all the bytes
    if (bytesRead != byteLength)
    {
        // handle error
    }
}
string valor = Convert.ToBase64String(buffer);
于 2013-07-01T13:46:54.633 に答える
0

画像をBase64Stringに変換するために使用したWPFコードを見て、問題を発見しました。同じ関数ImageToBase64Stringを作成したところ、動作するようになりました:

        string fileName = Server.MapPath("~/TempImages") + @"\foto.jpg";
        fileUpload1.SaveAs(fileName);

        System.Drawing.Image teste = System.Drawing.Image.FromFile(fileName);

        string valor = ImageToBase64String(teste, System.Drawing.Imaging.ImageFormat.Jpeg);

        //System.IO.FileStream fs = new System.IO.FileStream(fileName, System.IO.FileMode.Open, System.IO.FileAccess.Read);
        //System.IO.BinaryReader binaryReader = new System.IO.BinaryReader(fs);
        //long byteLength = new System.IO.FileInfo(fileName).Length;
        //byte[] buffer = binaryReader.ReadBytes((Int32)byteLength);
        //buffer = File.ReadAllBytes(fileName);
        //fs.Close();
        //fs.Dispose();

        //string valor = System.Text.Encoding.UTF8.GetString(buffer);
        img.ImageUrl = "data:image/jpg;base64," + valor;

しかし、以前のコードの何が問題だったのかまだわかりません。誰でも明確にできますか?

于 2013-07-01T13:46:13.323 に答える