当前位置:编程学习 > C#/ASP.NET >>

Image->byte[], byte[]-> Image

遇到的问题是这样的。
SQL 2K5 DB表中有一个ico字段,类型为Image.
我的一个对象里有个属性,类型也是Image。
当试图把该对象插到表中是,报无法将Bitmap转为Byte[].
于是乎,我写了两个方法,一个把Image转为byte[],另一个把byte[] 转为Image。如下:
         public static byte[] ImageToBytes(Image ico)
        {
            MemoryStream ms = new MemoryStream();
            ico.Save(ms,ico.RawFormat);
            return ms.ToArray();
        }

        public static Image BytesToImage( byte[] bytes )
        {
            MemoryStream stream = new MemoryStream();
            stream.Write(bytes, 0, bytes.Length);
            Image ico = Image.FromStream(stream);
           // Bitmap bitmap = new Bitmap(stream);
            return ico;
        }
这样,我在Save的时候ok了,但当试图从表中读取数据,转为Image时,出错,报"Parameter is not valid".
查了一下,“该流没有有效的图像格式".难道我从DB表中读出的bytes->MemoryStream,没有图像格式?
请指教。谢谢 --------------------编程问答--------------------

public static Image BytesToImage( byte[] bytes ) 
        { 
            MemoryStream stream = new MemoryStream(); 
            stream.Write(bytes, 0, bytes.Length); 
            Image ico = Image.FromStream(stream); 
           // Bitmap bitmap = new Bitmap(stream); 
            return ico; 
        } 

改为

public static Image BytesToImage( byte[] bytes ) 
        { 
            MemoryStream stream = new MemoryStream(bytes); 
            Image ico = Image.FromStream(stream); 
            return ico; 
        } 

--------------------编程问答-------------------- 试了下,一样的.
有没有别的方法呢?
Thanks --------------------编程问答-------------------- 可能我忘了说了,在取得Image的时候。
我有一个PictureBox.
我是通过
         public static Image StreamToImage(Stream s)
        {
            Image ico = Image.FromStream(s);
            return ico;
        }
Stream是又FileDialog.OpenFile().得到的. --------------------编程问答-------------------- 参考:

http://blog.csdn.net/insus/archive/2008/01/20/2055033.aspx --------------------编程问答-------------------- FileStream fileStream = new FileStream(路径,FileMode.Open, FileAccess.ReadWrite,FileShare.ReadWrite);
 Image img = Image.FromStream(fileStream);

pictureBox1.Image = Image.FromStream(fileStream);
然后在转化 --------------------编程问答-------------------- public static byte[] ImageToBytes(Image ico) 
        { 
            MemoryStream ms = new MemoryStream(); 
            ico.Save(ms,ico.RawFormat); 
            return ms.ToArray(); 
        } 

image.save要指定文件的格式的
 Save(Stream, ImageFormat)  将此图像以指定的格式保存到指定的流中。 

ImageFormat的属性
   名称 说明 
    Bmp  获取位图 (BMP) 图像格式。 
   Emf  获取增强型图元文件 (WMF) 图像格式。 
   Exif  获取可交换图像文件 (Exif) 格式。 
    Gif  获取图形交换格式 (GIF) 图像格式。 
  Guid  获取表示此 ImageFormat 对象的 Guid 结构。 
   Icon  获取 Windows 图标图像格式。 
    Jpeg  获取联合图像专家组 (JPEG) 图像格式。 
   MemoryBmp  获取内存位图图像格式。 
    Png  获取 W3C 可移植网络图形 (PNG) 图像格式。 
   Tiff  获取标记图像文件格式 (TIFF) 图像格式。 
   Wmf  获取 Windows 图元文件 (WMF) 图像格式。 
--------------------编程问答-------------------- 我想我的问题不是 从Stream-> Image
而是从DB中得到的Byte[] -> Image.

Image->Byte[]->Image.
难道是Image1->Byte[]1
再试图从Byte[]1-> Image1会出错?
有点焖`~
--------------------编程问答-------------------- 那我save的时候强硬的指定一种格式?
我用ico.Save(ms,ico.RawFormat);  
就是希望用该Image的格式来save. 难道这样有问题?
请指教
--------------------编程问答-------------------- 拿了张Jpeg,指定了
ico.Save(ms,ImageFormat.Jpeg);  
还是不行~:(
--------------------编程问答-------------------- 你这样试试
你image->byte[]之后不存到数据库中,直接再把byte[]->image看看有什么问题,如果没有问题的话,就说明你存到数据库或者取出数据的过程有问题 --------------------编程问答-------------------- image->byte[]之后不存到数据库中,直接再把byte[]->image是不会有问题的,是存到数据库时候数据格式转化了 --------------------编程问答--------------------

//ImageToByte(Image img) 
        public static byte[] ImageToByte(Image img)
        {
            byte[] byt = null;
            ImageConverter imgCvt = new ImageConverter();
            object obj = imgCvt.ConvertTo(img, typeof(byte[]));
            byt = (byte[])obj;
            return byt;
        }

我以前做水晶报表Barcode128码的时候研究过 这个 ,不知道对楼主有没有用。 --------------------编程问答-------------------- 试了一下,没用·:( 
meng_master说的对,不存到DB中,来回转换是没问题的,只是一存进去,再取出来就有问题了~:(
可知道如何解?
谢谢 --------------------编程问答-------------------- 存数据库里建议存成字符串格式
sting dataimage=Convert.ToBase64String(数据)
取出的时候在转成Image --------------------编程问答--------------------  public static string ImageToStr(PictureBox Pb)
        {
            MemoryStream ms = new MemoryStream();
            Pb.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
            return Convert.ToBase64String(ms.GetBuffer()).ToString();
        }
        public static Image StrToImage(string strImage)
        {
            byte[] bts = Convert.FromBase64String(strImage);
            MemoryStream ms = new MemoryStream();
            ms.Write(bts, 0, bts.Length);
            return Image.FromStream(ms);
        } --------------------编程问答-------------------- 试了一下,把DB里面字段的类型改成了nvarchar(max).
问题依旧,看了一下,当把Image转为Str后,该Str非常长,基本属于乱码。
但存到DB后,在字段里才一点点。显然数据不全。
然后再试图String->Image时,又报错~:( 
不知道为何~:( --------------------编程问答-------------------- 手动update了一下表字段,把字段update成“乱码”。
可以显示了。
为什么存DB的时候会自动截取啊~:(
有解决方法? --------------------编程问答-------------------- 我不知道你是怎么读取和写入数据库的,这有一篇文章你看看
http://support.microsoft.com/?id=317016
如何读取和写入文件或从 BLOB 列通过使用 ADO.NET 和 VisualC # .NET --------------------编程问答-------------------- 帮顶



请高手坐阵本群管理员
C C++ C# JAVA编程交流群:11713348 --------------------编程问答-------------------- DB里面字段类型改成Ntext就OK了
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,