将流保存到文件

时间:2009-08-25 13:48:45

标签: .net file-upload iostream

我有一个文件上传控件,允许用户上传图像,但在他们上传图像之前,我想将图像调整为mas 640x480大小,问题是我无法弄清楚接下来该做什么。这就是我所拥有的;

// CALL THE FUNCTION THAT WILL RESIZE THE IMAGE
protected void btnUploadFile_Click(object sender, EventArgs e)
{
    Stream imgStream = ir.ResizeFromStream(640, fupItemImage.PostedFile.InputStream);

    // What to do next? 
}

// THE FUNCTION THAT WILL RESIZE IMAGE THEN RETURN AS MEMORY STREAM
public MemoryStream ResizeFromStream(int MaxSideSize, Stream Buffer)
{
    int intNewWidth;
    int intNewHeight;
    System.Drawing.Image imgInput = System.Drawing.Image.FromStream(Buffer);

    // GET IMAGE FORMAT
    ImageFormat fmtImageFormat = imgInput.RawFormat;

    // GET ORIGINAL WIDTH AND HEIGHT
    int intOldWidth = imgInput.Width;
    int intOldHeight = imgInput.Height;

    // IS LANDSCAPE OR PORTRAIT ?? 
    int intMaxSide;

    if (intOldWidth >= intOldHeight)
    {
        intMaxSide = intOldWidth;
    }
    else
    {
        intMaxSide = intOldHeight;
    }


    if (intMaxSide > MaxSideSize)
    {
        // SET NEW WIDTH AND HEIGHT
        double dblCoef = MaxSideSize / (double)intMaxSide;
        intNewWidth = Convert.ToInt32(dblCoef * intOldWidth);
        intNewHeight = Convert.ToInt32(dblCoef * intOldHeight);
    }
    else
    {
        intNewWidth = intOldWidth;
        intNewHeight = intOldHeight;
    }

    // CREATE NEW BITMAP
    Bitmap bmpResized = new Bitmap(imgInput, intNewWidth, intNewHeight);

    // SAVE BITMAP TO STREAM
    MemoryStream imgMStream = new MemoryStream();
    bmpResized.Save(imgMStream, imgInput.RawFormat);

    // RELEASE RESOURCES
    imgInput.Dispose();
    bmpResized.Dispose();
    Buffer.Close();

    return imgMStream;
} 

谢谢

6 个答案:

答案 0 :(得分:1)

也许像

int length = 256;
int bytesRead = 0;
Byte[] buffer = new Byte[length];
using (FileStream fs = new FileStream(filename, FileMode.Create))
{
  do
  {
    bytesRead = imgStream.Read(buffer, 0, length);
    fs.Write(buffer, 0, bytesRead);
  }
  while (bytesRead == length);
}

答案 1 :(得分:0)

转储到文件将类似于:

using (FileStream fsOut = new FileStream("my\\file\\path.img", FileMode.Create))
using (MemoryStream msImg = new MemoryStream(ir.ResizeFromStream(640 ...)) )
{
    byte[] imgData = msImg.ToArray();
    fsOut.Write(imgData, 0, imgData.Length);
}

答案 2 :(得分:0)

我只是快速浏览一下,但是如果您已经成功执行了图像重新调整大小,那么您需要做的就是使用System.IO名称空间文件类通过写出字节将内存流保存到文件中从Memory Stream到您创建的File对象。如果您需要代码示例,请告诉我。

答案 3 :(得分:0)

FileStream fs=new FileStream("filename",FileMode.Create);
ir.ResizeFromStream(640, fupItemImage.PostedFile.InputStream).WriteTo(fs);
fs.Close();

答案 4 :(得分:0)

如果您没有使用ResizeFromStream返回的流,您也可以更改该方法并使其返回已转换的Bitmap。然后使用Bitmap.Save(<path>)将图像另存为文件。

答案 5 :(得分:0)

  1. 当遇到异常时,您当前的代码会泄漏资源。您应该始终在finally或catch块中调用.Dispose(取决于资源是否总是需要处理,或者只是在出错时需要处理)。尝试...最后Dispose可以简洁地使用using关键字编写 - 保存自己未来的头痛并尝试将所有IDisposable放在usingtry..catch块中。
  2. 默认情况下,使用Windows窗体调整图像大小将使用低质量的重新采样器。这通常导致看起来很糟糕的输出;您需要专门设置适当的插值模式(参见下面的代码)。
  3. 如果要保存图像,可能会遇到图像编解码器设置问题:默认情况下,默认的jpeg编码器输出质量非常低。您也需要手动设置(见下文)。
  4. 最后,将文件保存到磁盘或数据库实际上是最简单的部分 - 而不是保存到内存流,只需改为使用流参数。然后可以构造此参数以根据调用者的需要写入文件或数据库。
  5. 我使用以下函数调整图像大小(这将改变宽高比):

    public static Bitmap Resize(Image oldImage, int newWidth, int newHeight)
    {
        Bitmap bitmap = null;
        try
        {
            bitmap = new Bitmap(newWidth, newHeight);
            using (Graphics g = Graphics.FromImage(bitmap))
            {
                g.SmoothingMode = SmoothingMode.HighQuality;
                g.PixelOffsetMode = PixelOffsetMode.HighQuality;
                g.CompositingQuality = CompositingQuality.HighQuality;
                g.InterpolationMode = InterpolationMode.HighQualityBicubic;
                g.DrawImage(oldImage, new Rectangle(0, 0, newWidth, newHeight));
            }
        }
        catch
        {
            if (bitmap != null) bitmap.Dispose();
            throw;
        }
        return bitmap;
    }
    

    将文件另存为jpeg可以通过以下方式执行:

    public static void SaveImageAsJpeg(Image image, Stream outputStream, int quality)
    {
        ImageCodecInfo jpgInfo = ImageCodecInfo.GetImageEncoders()
            .Where(codecInfo => codecInfo.MimeType == "image/jpeg").First();
        using (EncoderParameters encParams = new EncoderParameters(1))
        {
            encParams.Param[0] = new EncoderParameter(Encoder.Quality,(long)quality);
            //quality should be in the range [0..100]
            image.Save(outputStream, jpgInfo, encParams);
        }
    }
    

    你可以通过......的某些方式使用

    using(var origImage=Image.FromStream(inputStream, true, true))
    {
        //set newWidth, newHeight however you wish; determine outputFilePath
        using(var newImage = Resize(origImage, newWidth, newHeight))
        using(var outputStream = File.Open(outputFilePath, FileMode.Create))
            SaveImageAsJpeg(newImage,outputStream, 90);
    }