如何在C#中把数据库里的二进制图片转换成jpg格式
我做了一个把图片转换成二进制存入oracle数据库的程序,我想把它从数据库里读出来并显示出来,希望是在后台写代码,请高手们帮帮忙! 问题点数:100、回复次数:41Top
1 楼hdt(倦怠)回复于 2006-09-04 10:42:52 得分 10
Image.Save(
Stream stream,
ImageFormat format
);Top
2 楼sshmsandy()回复于 2006-09-04 10:48:34 得分 0
upTop
3 楼zhgroup(王员外)回复于 2006-09-04 10:55:48 得分 0
TypeConverter.ConvertFrom
public object ConvertFrom(
object value
);
将给定值转换为此转换器的类型。
Top
4 楼qiuqiu1984()回复于 2006-09-04 10:56:52 得分 0
是把它转换成Image类型吗Top
5 楼qiuqiu1984()回复于 2006-09-04 10:58:02 得分 0
hdt(倦怠) 你能说清楚点吗,我是新手,谢谢Top
6 楼zpingy(阿平)回复于 2006-09-04 11:03:19 得分 15
void savejpg(String NAME)
{
SqlConnection CON = new SqlConnection();
SqlCommand CMD = new SqlCommand("SQL");
FileStream fs;
BinaryWriter bw;
int bufferSize = 1024;
byte[] outbyte = new byte[bufferSize];
long retval;
long startIndex = 0;
CON.Open();
SqlDataReader myReader = CMD.ExecuteReader(CommandBehavior.SequentialAccess);
while (myReader.Read())
{
fs = new FileStream(NAME, FileMode.OpenOrCreate, FileAccess.Write);
bw = new BinaryWriter(fs);
startIndex = 0;
retval = myReader.GetBytes(0, startIndex, outbyte, 0, bufferSize);
while (retval > 0)
{
bw.Write(outbyte);
bw.Flush();
startIndex += bufferSize;
retval = myReader.GetBytes(0, startIndex, outbyte, 0, bufferSize);
}
bw.Write(outbyte);
bw.Flush();
bw.Close();
fs.Close();
}
myReader.Close();
CON.Close();
}
类似Top
7 楼hdt(倦怠)回复于 2006-09-04 11:03:21 得分 5
从数据读图片代码比较长
就不写了
byte[] barrImage = 数据库存图片的二进制字段值
MemoryStream ms = new MemoryStream( barrImage );
Image image = Image.FormStream(ms);
image.Save( Response.OutputStream , ImageFormat.Jpeg )
Top
8 楼flyfootball()回复于 2006-09-04 11:17:00 得分 0
同意楼上Top
9 楼qiuqiu1984()回复于 2006-09-04 11:20:09 得分 0
Image 的引用为什么总是报错,不是using System.Drawing.Imaging;吗
Top
10 楼qiuqiu1984()回复于 2006-09-04 11:21:46 得分 0
谢谢大家的指点Top
11 楼hdt(倦怠)回复于 2006-09-04 11:21:52 得分 0
命名空间: System.Drawing
Top
12 楼qiuqiu1984()回复于 2006-09-04 11:42:33 得分 0
为什么还是报Image是不明确的引用Top
13 楼qiuqiu1984()回复于 2006-09-04 11:50:52 得分 0
c:\inetpub\wwwroot\WebApporacle\WebForm1.aspx.cs(51): 找不到类型或命名空间名称“image”(是否缺少 using 指令或程序集引用?)
Top
14 楼qiuqiu1984()回复于 2006-09-04 11:51:17 得分 0
c:\inetpub\wwwroot\WebApporacle\WebForm1.aspx.cs(50): “Image”是不明确的引用
Top
15 楼hdt(倦怠)回复于 2006-09-04 11:53:53 得分 15
考虑是否你的程序里有叫Image的类
另用System.Drawing.Image 代替ImageTop
16 楼jackyped(MSN: jpu_jacky@eyou.com)回复于 2006-09-04 12:37:21 得分 0
用System.Drawing.Image 代替Image应该不会再报不明确的引用Top
17 楼xfary(风飘摇)回复于 2006-09-04 13:15:17 得分 0
private Image RenderImage(byte[] byteImg)
{
System.Drawing.Image image1 = System.Drawing.Image.FromStream(new MemoryStream(byteImg));
return image1;
}Top
18 楼qiuqiu1984()回复于 2006-09-04 13:50:44 得分 0
System.Drawing.Image image = System.Drawing.Image.FromStream(ms,true);
使用了无效参数。
Top
19 楼qiuqiu1984()回复于 2006-09-04 13:52:00 得分 0
大家帮我 看看代码吗
public string bind()
{
StringBuilder sb=new StringBuilder();
strsql="select docid,fileid,rowed,filecon from docmapfile";
OracleDataAdapter da = new OracleDataAdapter(strsql,conn);
da.Fill(ds);
this.text1.Value=ds.Tables[0].Rows[0].ItemArray[0].ToString();
this.text2.Value=ds.Tables[0].Rows[0].ItemArray[1].ToString();
this.text3.Value=ds.Tables[0].Rows[0].ItemArray[2].ToString();
byte[] barrImage=(byte[])ds.Tables[0].Rows[0].ItemArray[3];
MemoryStream ms = new MemoryStream(barrImage);
System.Drawing.Image image = System.Drawing.Image.FromStream(ms,true);
image.Save( Response.OutputStream , ImageFormat.Jpeg );
sb.Append(image.ToString());
conn.Close();
return sb.ToString();
}Top
20 楼jedliu(21世纪什么最贵? 人才!)回复于 2006-09-04 14:34:09 得分 0
不错,挺好!Top
21 楼jedliu(21世纪什么最贵? 人才!)回复于 2006-09-04 14:43:58 得分 0
MemoryStream ms = new MemoryStream( barrImage );
Image image = Image.FormStream(ms,true);
image.Save( Response.OutputStream ,ImageFormat.Jpeg )
关键就是这里Top
22 楼qiuqiu1984()回复于 2006-09-04 15:25:29 得分 0
我就是System.Drawing.Image image = System.Drawing.Image.FromStream(ms,true);
这里报错,使用了无效参数。Top
23 楼qiuqiu1984()回复于 2006-09-04 15:26:00 得分 0
大家知道我那里写错了吗,请帮帮忙Top
24 楼zhfj001(面包会有的,牛奶也会有的。)回复于 2006-09-04 15:37:00 得分 0
to 我就是System.Drawing.Image image = System.Drawing.Image.FromStream(ms,true);
这里报错,使用了无效参数。
我刚遇到了个类似的错误,请检查一下你的ms是否已经保存了内容.
可能是你的ms根本没有取到值.Top
25 楼qiuqiu1984()回复于 2006-09-04 15:52:09 得分 0
我的ms里面有值,我调试看了的,除了这里,那里还有错吗?Top
26 楼interboy(冯东)回复于 2006-09-04 16:30:29 得分 15
插入时把图片数据作为Byte数组插入数据库,下面是把文件转换成数组
private byte[] ReadImageData(string strFileName)
{
byte[] BlobData = null;
Bitmap picture;
FileStream stream;
stream = new FileStream(strFileName,FileModel.Open,FileAccess.Read);
BlobData = new byte[stream.Length];
stream.Read(BlobData,0,(int)stream.Length);
picture = new Bitmap(stream);
stream.Close();
return BlobData;
}
从数据库中读取图片文件数据转换成byte数组,下面是如何将数组转换为图片
private Bitmap GetBitmap(byte[] img)
{
if(img != null)
{
MemoryStream ms = new MemoryStream(img,true);
ms.Read(img,0,img.Length);
Bitmap bmp = new Bitmap(ms);
ms.Close();
return bmp;
}
else
return null;
}
Top
27 楼interboy(冯东)回复于 2006-09-04 16:35:45 得分 0
this.oracleConnection1.Open();
byte[] pic = (byte[])ocm.ExecuteScalar();//这个命令只返回图象数据
this.oracleConnection1.Close();
System.IO.MemoryStream ms = new System.IO.MemoryStream(pic);
System.Drawing.Image img = System.Drawing.Image.FromStream(ms);
this.pictureBox1.Image = img;Top
28 楼zhfj001(面包会有的,牛奶也会有的。)回复于 2006-09-04 17:17:07 得分 5
to 我的ms里面有值,我调试看了的,除了这里,那里还有错吗?
如果你的ms中有值,就不应该提示这个错误了,
它还报什么错?Top
29 楼qiuqiu1984()回复于 2006-09-05 08:42:22 得分 0
我已经找到错误了,我数据库里的值是图片的绝对路径,而不是图片,怎么才能获的图片呢Top
30 楼zhangqing_123()回复于 2006-09-05 08:46:59 得分 10
public void bindphoto(string xh,PictureBox pictureBox1)
{
dbcontroller obj=new dbcontroller();
string sql="SELECT * FROM photo WHERE xh='" + xh + "'";
obj.open();
DataSet myphotods = obj.GetDs(sql);
obj.close();
if (myphotods.Tables[0].Rows.Count > 0)
{
byte[] bytephoto = new byte[0];
bytephoto = (byte[])(myphotods.Tables[0].Rows[0]["ZP"]);
MemoryStream stmPhoto = new MemoryStream(bytephoto);
pictureBox1.Image = Image.FromStream(stmPhoto);
}
else
{
pictureBox1.Image = null;
}
}Top
31 楼zhangqing_123()回复于 2006-09-05 08:47:44 得分 0
我这个够详细了吧
Top
32 楼zhangqing_123()回复于 2006-09-05 08:48:48 得分 0
一看就会明白了!就是从数据库里读数据,然后显示在图片框里,同时对数据库里有没有图片进行验证一下!Top
33 楼qiuqiu1984()回复于 2006-09-05 08:55:28 得分 0
我的意识是怎么能把路径改为图片,Top
34 楼zhangqing_123()回复于 2006-09-05 08:56:47 得分 0
路径改为图片??说清楚详细一点!!Top
35 楼zhangqing_123()回复于 2006-09-05 08:58:13 得分 0
明白了?上面的没看,呵呵!你可以把绝对路径转成相对路径Top
36 楼itmingong(nous+wisdom+courage)回复于 2006-09-05 09:01:46 得分 0
我也学习一下Top
37 楼qiuqiu1984()回复于 2006-09-05 09:03:18 得分 0
就是我找的到图片的路径,我想把图片转成二进制存入数据库里,但是我现在是把路径转换成二进制存进去的,所有我想通过路径获的图片,把图片存入数据库,Top
38 楼qiuqiu1984()回复于 2006-09-05 09:06:28 得分 0
我是用winform作的图片存入数据库,然后通过web显示出来Top
39 楼zhangqing_123()回复于 2006-09-05 09:07:19 得分 0
是CS模式的,还是BS模式的程序?Top
40 楼zhangqing_123()回复于 2006-09-05 09:11:06 得分 15
哦,这我倒没试过,我这有一个用OPENDIALOG控件(CS模式下)和使用UploadFile控件(BS模式下)的存图片的函数!
//=============================================================
// 函 数 名:Savephoto
// 功能描述:添加或修改照片
// 输入参数:学生学号,已经打开文件的openFileDialog
// 返 回 值:无
//=============================================================
public void Savephoto(string xh,OpenFileDialog openFileDialog1)
{
//定义byte类型变量
byte[] myblob = null;
Stream fs;
//给变量blob赋值
fs =openFileDialog1.OpenFile();
if(fs!=null)
{
openFileDialog1.Reset();
myblob = new byte[fs.Length];
fs.Read(myblob,0,int.Parse(myblob.Length.ToString()));
fs.Close();
OracleDataAdapter myoda;
OracleCommand cmd;
DataSet myds = new DataSet();
DataTable mydt = new DataTable();
DataRow mydr;
string connstr="User ID=student;Data Source=hres;Password=studentmanage";
OracleConnection conn= new OracleConnection(connstr);
string selesql;
selesql = "SELECT * FROM photo WHERE xh='" + xh + "'";
cmd = new OracleCommand(selesql,conn);
myoda = new OracleDataAdapter(selesql,conn);
myoda.SelectCommand = cmd;
myoda.Fill(myds, "PHOTO");
string info = "";
if (myds.Tables[0].Rows.Count > 0)//修改照片
{
info = "修改照片成功";
string updatesql = "UPDATE photo SET zp=:vPHOTO WHERE xh='" + xh + "'";
OracleCommand updatecmd = new OracleCommand(updatesql,conn);
myoda.UpdateCommand = updatecmd;
myoda.UpdateCommand.Parameters.Add(":vPHOTO", OracleType.Blob, myblob.Length, "ZP");
myoda.MissingSchemaAction = MissingSchemaAction.AddWithKey;
myoda.FillSchema(myds, SchemaType.Source, "PHOTO");
myoda.Fill(myds, "PHOTO");
mydt = myds.Tables[0];
mydr = mydt.Rows[0];
string a = mydr["XH"].ToString();
mydr.BeginEdit();
mydr["XH"] = xh;
mydr["ZP"] = myblob;
mydr.EndEdit();
myoda.Update(myds, "PHOTO");
}
else//上传新照片
{
info = "上传新照片成功";
string insertsql = "INSERT INTO photo (xh,zp) VALUES ('" + xh + "',:vPHOTO)";
OracleCommand insertcmd = new OracleCommand(insertsql,conn);
myoda.InsertCommand = insertcmd;
myoda.InsertCommand.Parameters.Add(":vPHOTO", OracleType.Blob, myblob.Length, "ZP");
myoda.MissingSchemaAction = MissingSchemaAction.AddWithKey;
myoda.FillSchema(myds, SchemaType.Source, "PHOTO");
myoda.Fill(myds, "PHOTO");
mydt = myds.Tables[0];
mydr = mydt.NewRow();
mydr.BeginEdit();
mydr["XH"] = xh;
mydr["ZP"] = myblob;
mydr.EndEdit();
mydt.Rows.Add(mydr);
myoda.Update(myds, "PHOTO");
}
MessageBox.Show(info);
}
}Top
41 楼zhangqing_123()回复于 2006-09-05 09:11:34 得分 10
/// 上传图片
private void SavePhoto(string xh)
{
if(IsAllowedExtension(UploadFile))
{
//如果是修改图片,则将修改前图片删掉
string[] arrExtension = {".gif",".jpg",".jpeg",".bmp",".png"};
string path1="";
//判断该扩展名是否合法
for(int i = 0; i< arrExtension.Length; i++)
{
string fileName1=TextBox_xh.Text;
path1=Server.MapPath(".") + @"\Photo\" +fileName1+arrExtension[i];
if(File.Exists(path1))
{
FileInfo delete=new FileInfo(path1);
delete.Delete();
break;
}
}
//上传图片
string extension = Path.GetExtension(UploadFile.PostedFile.FileName).ToLower();
// string extension=".jpg";
string fileName=TextBox_xh.Text;
string path = Server.MapPath(".") + @"\Photo\" + fileName + extension;
//保存图片到服务器目录下
UploadFile.PostedFile.SaveAs(path);
//得到图片的二进制形式
HttpPostedFile upFile=UploadFile.PostedFile;
//得到上传文件的长度;
int upFileLength=upFile.ContentLength;
string ContentType=upFile.ContentType;
byte[] bPicture;
bPicture=new byte[upFileLength];
Stream filestream=upFile.InputStream ;
filestream.Read (bPicture,0,upFileLength);
filestream.Close ();
OracleDataAdapter myoda;
DataSet myds = new DataSet();
System.Data.DataTable mydt = new System.Data.DataTable();
DataRow mydr;
OracleCommand cmd;
string connstr="User ID=student;Data Source=hers;Password=studentmanage";
OracleConnection conn= new OracleConnection(connstr);
string selesql = "SELECT * FROM photo WHERE xh='" + xh + "'";
cmd = new OracleCommand(selesql,conn);
myoda = new OracleDataAdapter(selesql,conn);
myoda.SelectCommand = cmd;
myoda.Fill(myds, "PHOTO");
string insertsql = "INSERT INTO photo (xh,zp) VALUES ('" + xh + "',:vPHOTO)";
string updatesql = "UPDATE photo SET zp=:vPHOTO WHERE xh='" + xh + "'";
try
{
if(myds.Tables[0].Rows.Count > 0)
{
OracleCommand updatecmd = new OracleCommand(updatesql,conn);
myoda.UpdateCommand = updatecmd;
myoda.UpdateCommand.Parameters.Add(":vPHOTO", OracleType.Blob, bPicture.Length, "ZP");
myoda.MissingSchemaAction = MissingSchemaAction.AddWithKey;
myoda.FillSchema(myds, SchemaType.Source, "PHOTO");
myoda.Fill(myds, "PHOTO");
mydt = myds.Tables[0];
mydr = mydt.Rows[0];
string a = mydr["XH"].ToString();
mydr.BeginEdit();
mydr["XH"] = xh;
mydr["ZP"] = bPicture;
mydr.EndEdit();
myoda.Update(myds, "PHOTO");
pictureBox1.ImageUrl=path;
}
else
{
OracleCommand insertcmd = new OracleCommand(insertsql, conn);
myoda.InsertCommand = insertcmd;
myoda.InsertCommand.Parameters.Add(":vPHOTO", OracleType.Blob,bPicture.Length, "ZP");
myoda.MissingSchemaAction = MissingSchemaAction.AddWithKey;
myoda.FillSchema(myds, SchemaType.Source, "PHOTO");
myoda.Fill(myds, "PHOTO");
mydt = myds.Tables[0];
mydr = mydt.NewRow();
mydr.BeginEdit();
mydr["XH"] = xh;
mydr["ZP"] = bPicture ;
mydr.EndEdit();
mydt.Rows.Add(mydr);
myoda.Update(myds, "PHOTO");
pictureBox1.ImageUrl=path;
}
}
catch
{
throw;
}
}
}Top




