首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

请教 一个 image 图片转换成Byte[]数组的有关问题

2013-06-26 
【求助】请问 一个 image 图片转换成Byte[]数组的问题本帖最后由 yan_hyz 于 2013-03-08 16:18:50 编辑RT,我

【求助】请问 一个 image 图片转换成Byte[]数组的问题
本帖最后由 yan_hyz 于 2013-03-08 16:18:50 编辑 RT,我有一个Image图片 格式不一定,然后我通过MemoryStream流将图片保存在一个Byte数组中,然后将整个Byte数组 以二进制的形式保存在文件里面,接着从该文件中读取字节留到byte数组, 再转换成 Image图片,那么在从文件中读取字节流的时候读取出来的数据保存在Byte数组里面,那么整个 byte数组 应该定义多大呢???

说 不好说清楚,我上代码吧,帮我看看 会不会 造成数组不够长的情况:
代码写入文件的:



  System.IO.MemoryStream ms = new System.IO.MemoryStream();
            this._image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
            byte[] bytes = new byte[] { };
            bytes = ms.GetBuffer();
            outStream.writeByteArray(bytes);
//上面是转换为byte数组,下面这段是写入文件:
    public void writeByteArray(byte[] bytes)
        {
            long length = bytes.Length;
            byte[] tbs = BitConverter.GetBytes(length);
            for (int i = 0; i < tbs.Length; i++)
            {
                writer.Write(tbs[i]);
            }
            for (int i = 0; i < bytes.Length; i++)
            {
                writer.Write(bytes[i]);
            }
        }

  

读取文件数据的代码:



 public byte[] readBytesArray()
        {
            ulong temp = 0;
            ulong length = (ulong)BitConverter.GetBytes(temp).Length;
            byte[] byLen = new byte[length];
            for (ulong i = 0; i < length; i++)
            {
                byLen[i] = cacheBuff[this.position++];
            }
            length = BitConverter.ToUInt64(byLen, 0);
            byte[] bytes = new byte[length];
            for (ulong i = 0; i < length; i++)
            {
                bytes[i] = cacheBuff[this.position++];


            }

            return bytes;
        }

然后转换成image图片的代码如下:

  byte[] bytes = inStream.readBytesArray();
            System.IO.MemoryStream ms = new System.IO.MemoryStream();
            ms.Write(bytes,0,bytes.Length);
            this._image = Bitmap.FromStream(ms);



这两段代码这样写,会不会造成 图片信息 丢失呢??

如果 有可能发生 异常的问题,那么 合理的写法 该如何写呢??

谢谢 大家 帮忙了

发到 这个 板块 也不知道 位置发的对不对

请教 一个 image 图片转换成Byte[]数组的有关问题 byte image 读写?byte数组到文件
[解决办法]
http://msdn.microsoft.com/zh-cn/library/system.io.fileinfo.length(v=vs.100).aspx
[解决办法]
文件格式是BNG?
[解决办法]
FineUi内部资源调用类,直接拿去用,不用客气

using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Reflection;
using System.IO;
using System.Drawing.Imaging;

namespace FineUI
{
    /// <summary>
    /// 资源处理程序
    /// </summary>
    public class ResourceHandler : IHttpHandler
    {
        /// <summary>
        /// 处理资源的请求
        /// </summary>
        /// <param name="context">Http请求上下文</param>
        public void ProcessRequest(HttpContext context)
        {
            string type = String.Empty, 
                typeValue = String.Empty,
                resName = "FineUI.";
                

            if (!String.IsNullOrEmpty(typeValue = context.Request.QueryString["icon"]))
            {
                type = "icon";
            }


            else if (!String.IsNullOrEmpty(typeValue = context.Request.QueryString["js"]))
            {
                type = "js";
                resName += "js." + typeValue;
            }
            else if (!String.IsNullOrEmpty(typeValue = context.Request.QueryString["lang"]))
            {
                type = "lang";
                resName += "js.lang." + typeValue;
            }
            else if (!String.IsNullOrEmpty(typeValue = context.Request.QueryString["theme"]))
            {
                type = "theme";
                resName += "res.theme." + typeValue;
            }
            else if (!String.IsNullOrEmpty(typeValue = context.Request.QueryString["css"]))
            {
                type = "css";
                resName += "res.css." + typeValue;
            }
            else if (!String.IsNullOrEmpty(typeValue = context.Request.QueryString["img"]))
            {
                type = "img";
                resName += "res.img." + typeValue;
            }

            byte[] binary;
            switch (type)
            {
                case "icon":
                    if (!typeValue.EndsWith(".png") && !typeValue.EndsWith(".gif"))
                    {
                        typeValue = IconHelper.GetName((Icon)Enum.Parse(typeof(Icon), typeValue));
                    }


                    //resName += "res.icon." + typeValue;
                    string serverPath = String.Format("{0}/{1}", GlobalConfig.GetIconBasePath(), typeValue);
                    context.Response.WriteFile(context.Server.MapPath(serverPath));

                    context.Response.ContentType = "image/" + GetImageFormat(typeValue);
                    break;
                case "js":
                case "lang":
                    context.Response.Write(ResourceHelper.GetResourceContent(resName));
                    context.Response.ContentType = "text/javascript";
                    break;
                case "css":
                    context.Response.Write(ResourceHelper.GetResourceContent(resName));
                    context.Response.ContentType = "text/css";
                    break;
                case "theme":
                case "img":
                    binary = ResourceHelper.GetResourceContentAsBinary(resName);
                    context.Response.OutputStream.Write(binary, 0, binary.Length);
                    //context.Response.Write(ResourceHelper.GetResourceContent(resName));
                    context.Response.ContentType = "image/" + GetImageFormat(resName);
                    break;
            }

            
            // 缓存一年,只能通过改变 URL 来强制更新缓存
            context.Response.Cache.SetExpires(DateTime.Now.AddYears(1));
            context.Response.Cache.SetCacheability(HttpCacheability.Public);
        }



        //private void RenderImage(HttpContext context, string resName)
        //{
        //    Assembly assembly = Assembly.GetExecutingAssembly();
        //    using (Stream stream = assembly.GetManifestResourceStream(resName))
        //    {
        //        using (System.Drawing.Image image = System.Drawing.Image.FromStream(stream))
        //        {
        //            // PNG输出时出现“GDI+ 中发生一般性错误”
        //            using (MemoryStream ms = new MemoryStream())
        //            {
        //                image.Save(ms, image.RawFormat);
        //                ms.WriteTo(context.Response.OutputStream);
        //                context.Response.ContentType = "image/" + GetImageFormat(image.RawFormat);
        //            }
        //        }
        //    }
        //}

        private string GetImageFormat(string imageName)
        {
            int lastDotIndex = imageName.LastIndexOf(".");
            if (lastDotIndex >= 0)
            {
                return imageName.Substring(lastDotIndex + 1);
            }
            return "png";
        }

        private string GetImageFormat(ImageFormat format)
        {
            if (format == ImageFormat.Bmp)
            {
                return "bmp";
            }
            else if (format == ImageFormat.Gif)
            {


                return "gif";
            }
            else if (format == ImageFormat.Jpeg)
            {
                return "jpeg";
            }
            else if (format == ImageFormat.Png)
            {
                return "png";
            }
            else if (format == ImageFormat.Tiff)
            {
                return "tiff";
            }
            else if (format == ImageFormat.Icon)
            {
                return "icon";
            }
            return "gif";
        }


        /// <summary>
        /// 只要请求的 URL 相同,则请求可以重用
        /// </summary>
        public bool IsReusable
        {
            get
            {
                return true;
            }
        }
    }
}

热点排行