0

イメージを SQL DB に正常に保存できました。varchar50 としてイメージのフィールドがあります。これは私が試したコードです

DataTable dt=new DataTable();
dt=neworder.Selectfromimage1();

if (dt.Rows.Count > 0)
{

 // byte[] image =(byte[])dt.Rows[0]["image"];
 byte image=Convert.ToByte(dt.Rows[0]["image"]);
 MemoryStream stream = new MemoryStream(image);
 //stream.Write(image, 0, image.Length);
 stream.Seek(0,

 SeekOrigin.Begin);
 stream.Close();

 btncompanion.Image =

 Image.FromStream(stream);
 }

「入力文字列が正しい形式ではありませんでした」というエラーが表示されます

byte image=Convert.ToByte(dt.Rows[0]["image"]);

編集済み

画像を保存するコードは

private byte[] ImageToStream(string fileName)
{

 MemoryStream stream = new MemoryStream();
 tryagain:

 try
 {

  Bitmap image = new Bitmap(fileName);
  image.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);

  // image.Save(stream, System.Drawing.Imaging.ImageFormat.Gif);
 }

 catch (Exception )
 {

  goto tryagain;
 }

 return stream.ToArray();
}
fName ="C:\\Documents and Settings\\KAEM\\My Documents\\My Pictures\\images.jpg";
if (File.Exists(fName))
{

 int id = 2;
 byte[] content = ImageToStream(fName);
 if (neworder.Insertintoimage1(content.ToString()))
 {

}

}

else
{

 MessageBox.Show(fName + " not found ");
}
4

3 に答える 3

1

読み込もうとする前にストリームを閉じています。それはうまくいきません。次のことを試してください。

byte[] image=Convert.ToByte(dt.Rows[0]["image"]);
using (MemoryStream stream = new MemoryStream(image))
{
    btncompanion.Image = Image.FromStream(stream);
}

これが機能せず、GDI+ エラーが発生する場合は、イメージが逆シリアル化される前にストリームが閉じられているためです。その場合、これを使用します:

byte image=Convert.ToByte(dt.Rows[0]["image"]);
MemoryStream stream = new MemoryStream(image);
btncompanion.Image = Image.FromStream(stream);

また、画像を保存するコードでは、画像ファイルからバイトを取得しますが、それらをstringデータベースに渡します。画像バイトには、文字列から削除された、または文字列を終了する印刷不可能なバイトが含まれる可能性があるという事実を認識していますか?

画像を文字列として保存しないか、少なくとも base 64 エンコーディングを使用してください。そのためのコードは次のようになります。

if (File.Exists(fName))
{
    byte[] content = ImageToStream(fName);
    string contentBase64 = Convert.ToBase64String(content);
    if (neworder.Insertintoimage1(contentBase64))
        ....
}

そして取得するには:

string image = dt.Rows[0]["image"];
byte[] imageBytes = Convert.FromBase64String(image);

MemoryStream stream = new MemoryStream(imageBytes);
btncompanion.Image = Image.FromStream(stream);
于 2013-02-06T08:09:36.493 に答える
1

画像へのパスをデータベースに保存します。コードは次のようになります。

string imagePath=dt.Rows[0]["image"].ToString();
            byte[] imageBytes;
            using (FileStream fs = File.Open(imagePath)) {
                 btncompanion.Image = Image.FromStream(fs);
            }

これを試してください、テストされていません

于 2013-02-06T07:57:10.427 に答える
0

varchar 文字列を生成するためにデータがどのようにエンコードされたかを把握する必要があります。たとえば、base64 の場合は、次を使用しますConvert.FromBase64String

byte[] image = Convert.FromBase64String(dt.Rows[0]["image"])

さて、あなたは画像を保存しているので、それがどのようにエンコードされているかを知っている必要があり、逆のプロセスを実行して元に戻すことができるはずです.

于 2013-02-06T07:06:26.093 に答える