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

ms.GetBuffer() 是把内存储器里边的东西,保存为2进制格式吗

2013-10-22 
ms.GetBuffer() 是把内存里边的东西,保存为2进制格式吗?ms.GetBuffer() 是把内存里边的东西,保存为2进制格

ms.GetBuffer() 是把内存里边的东西,保存为2进制格式吗?
ms.GetBuffer() 是把内存里边的东西,保存为2进制格式吗?



ms = new MemoryStream();
final_image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
Thumbnail thumb = new Thumbnail(thumbnail_id, ms.GetBuffer()  );


完整

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.IO;
using System.Collections.Generic;

public partial class upload : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        
        System.Drawing.Image thumbnail_image = null;
        System.Drawing.Image original_image = null;
        System.Drawing.Bitmap final_image = null;
        System.Drawing.Graphics graphic = null;
        MemoryStream ms = null;

        try
        {
            // Get the data  得到上传的文件
            HttpPostedFile jpeg_image_upload = Request.Files["Filedata"];

            // Retrieve the uploaded image  把上传文件转化为 Image
            original_image = System.Drawing.Image.FromStream(jpeg_image_upload.InputStream);




            // Calculate the new width and height 下边一整段,都是计算长宽的,具体算法没有深究
            int width = original_image.Width;     //原始宽度
            int height = original_image.Height;   //原始长度
            int target_width = 200;
            int target_height = 200;
            int new_width, new_height;

            float target_ratio = (float)target_width / (float)target_height;  //目标 宽长比
            float image_ratio = (float)width / (float)height;   //原始  宽长比

            if (target_ratio > image_ratio)   //计算出新的长宽。 
            {
                new_height = target_height;
                new_width = (int)Math.Floor(image_ratio * (float)target_height);
            }
            else
            {
                new_height = (int)Math.Floor((float)target_width / image_ratio);
                new_width = target_width;
            }

            new_width = new_width > target_width ? target_width : new_width;
            new_height = new_height > target_height ? target_height : new_height;
            
            


            // Create the thumbnail  创建缩略图
            
            // Old way
            //thumbnail_image = original_image.GetThumbnailImage(new_width, new_height, null, System.IntPtr.Zero);
                // We don't have to create a Thumbnail since the DrawImage method will resize, but the GetThumbnailImage looks better


                // I've read about a problem with GetThumbnailImage. If a jpeg has an embedded thumbnail it will use and resize it which
                //  can result in a tiny 40x40 thumbnail being stretch up to our target size

            
            final_image = new System.Drawing.Bitmap(target_width, target_height);  //创建指定大小的位图
            graphic = System.Drawing.Graphics.FromImage(final_image);              //为什么要通过Bitmap转一下?  应该是可以动态画画
            //黑色的画笔,在graphic内画一个指定的矩形
            graphic.FillRectangle(new System.Drawing.SolidBrush(System.Drawing.Color.Black), new System.Drawing.Rectangle(0, 0, target_width, target_height));
            int paste_x = (target_width - new_width) / 2;
            int paste_y = (target_height - new_height) / 2;
            graphic.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; /* new way */ //一个图像插值算法
            //graphic.DrawImage(thumbnail_image, paste_x, paste_y, new_width, new_height);
            graphic.DrawImage(original_image, paste_x, paste_y, new_width, new_height);  //载入原始图,按指定大小重新绘制
            
            // Store the thumbnail in the session (Note: this is bad, it will take a lot of memory, but this is just a demo)
            ms = new MemoryStream();
            final_image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);//不明白,这里并没有建立什么联系???





            // Store the data in my custom Thumbnail object
            string thumbnail_id = DateTime.Now.ToString("yyyyMMddHHmmssfff");  //设置文件名
            Thumbnail thumb = new Thumbnail(thumbnail_id, ms.GetBuffer());

            // Put it all in the Session (initialize the session if necessary)            
            List<Thumbnail> thumbnails = Session["file_info"] as List<Thumbnail>;
            if (thumbnails == null)
            {
                thumbnails = new List<Thumbnail>();
                Session["file_info"] = thumbnails;
            }
            thumbnails.Add(thumb);

            Response.StatusCode = 200;
            Response.Write(thumbnail_id);
        }
        catch
        {
            // If any kind of error occurs return a 500 Internal Server error
            Response.StatusCode = 500;
            Response.Write("An error occured");
            Response.End();
        }
        finally
        {
            // Clean up
            if (final_image != null) final_image.Dispose();
            if (graphic != null) graphic.Dispose();


            if (original_image != null) original_image.Dispose();
            if (thumbnail_image!= null )thumbnail_image.Dispose();
            if (ms != null) ms.Close();
            Response.End();
        }
    
    }
}


[解决办法]
GetBuffer:

The byte array from which this stream was created, or the underlying array if a byte array was not provided to the MemoryStream constructor during construction of the current instance.

参考:
http://msdn.microsoft.com/en-US/library/system.io.memorystream.getbuffer(v=vs.80).aspx
[解决办法]
如果想保存到byte[]中。应该使用ToArray.

MemoryStream.ToArray Method:
Writes the stream contents to a byte array, regardless of the Position property.

参考:
http://msdn.microsoft.com/en-US/library/system.io.memorystream.toarray(v=vs.80).aspx

热点排行