【问题标题】:How do I resize an image after converting it from a BLOB?从 BLOB 转换图像后如何调整图像大小?
【发布时间】:2012-09-07 09:26:03
【问题描述】:

我正在尝试在通用处理程序中调整图像服务器端的大小,然后将其从数据库中的 BLOB 转换回图像...这是我的处理程序代码:

<%@ WebHandler Language="C#" Class="Image" %>

using System;
using System.Web;
using System.Data;
using System.Data.SqlClient;
using System.IO;

public class Image : IHttpHandler {

    public void ProcessRequest (HttpContext context) {
        Guid id = new Guid(context.Request.QueryString["Id"]);
        int column = 7;

        if (context.Request.QueryString["img"] == "tbn")
        {
            column = 6;
        }

        context.Response.ContentType = "image/png";
        MemoryStream strm = new MemoryStream(returnImage(id, column));
        byte[] buffer = new byte[4096];
        int byteSeq = strm.Read(buffer, 0, 4096);
        while (byteSeq > 0)
        {
            context.Response.OutputStream.Write(buffer, 0, byteSeq);
            byteSeq = strm.Read(buffer, 0, 4096);
        }
    }

    public Byte[] returnImage(Guid id, int column)
    {
        SqlConnection sqlCn = new SqlConnection("Data Source=localhost;Initial Catalog=database;User ID=user;Password=password");

        string qry = "SELECT * FROM Project WHERE Id=@id";
        SqlCommand cmd = new SqlCommand(qry, sqlCn);
        cmd.Parameters.Add("@id", SqlDbType.UniqueIdentifier).Value = id;
        sqlCn.Open();
        SqlDataReader dr = cmd.ExecuteReader();
        dr.Read();
        Byte[] ar = (Byte[])(dr[column]);
        dr.Close();
        cmd.Dispose();
        sqlCn.Close();
        return ar;
    }

    public bool IsReusable {
        get {
            return false;
        }
    }

}

它应该看起来图像宽度是否高于其高度,反之亦然,根据该设置设置高度或宽度,其他值(高度/宽度)应按比例设置,以免被拉伸。

我发现的是:http://www.codeproject.com/Articles/25838/A-Simple-Image-Handler

但我真的不知道如何使用它...有什么建议吗?感谢您提前提供的所有帮助!

【问题讨论】:

    标签: c# .net resize blob generic-handler


    【解决方案1】:

    这可能有点啰嗦,但对我有用。给定来自 blob 的内存流,加上目标宽度和高度尺寸,它将返回一个带有调整大小的图像副本的新流。

     public static Stream CreateThumbnail(Stream input, Int32 targetWidth, Int32 targetHeight)
        {
            output = new MemoryStream();
                using (Bitmap bitmap = new Bitmap(input))
                {
                    ImageFormat format = bitmap.RawFormat;
                    Boolean isJpeg = (format.Equals(ImageFormat.Jpeg));
                    Boolean isPng = (format.Equals(ImageFormat.Png));
                    Int32 width = bitmap.Width;
                    Int32 height = bitmap.Height;
                    getTargetSizes(out width, out height, bitmap, targetWidth, targetHeight);
                    using (Bitmap thumbnailBitmap = new Bitmap(width, height))
                    {
                        Graphics G = Graphics.FromImage(thumbnailBitmap);
                        G.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                        G.DrawImage(bitmap, 0, 0, width, height);
                        thumbnailBitmap.SetResolution(72, 72);
                        if (isJpeg)
                        {
                            var codecParams = new EncoderParameters(1);
                            codecParams.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 80L);
                            ImageCodecInfo[] arrayICI;
                            ImageCodecInfo jpegICI = null;
                            arrayICI = ImageCodecInfo.GetImageEncoders();
                            for (int i = 0; i < arrayICI.Length; i++)
                            {
                                if (arrayICI[i].FormatDescription.Equals("JPEG"))
                                {
                                    jpegICI = arrayICI[i];
                                    break;
                                }
                            }
                            thumbnailBitmap.Save(output, jpegICI, codecParams);
                        }
                        else
                        {
                            thumbnailBitmap.Save(output, ImageFormat.Png);
                        }
                    }
                }
            return output;
        }
    
        private static void getTargetSizes(out Int32 targetWidth, out Int32 targetHeight, Bitmap BM, Int32 maxWidth = 150, Int32 maxHeight = 150)
        {
            Int32 startWidth = BM.Width;
            Int32 startHeight = BM.Height;
            targetWidth = startWidth;
            targetHeight = startHeight;
            Boolean resizeByWidth = false;
            Boolean resizeByHeight = false;
            if ((maxWidth > 0) && (maxHeight > 0))
            {
                if ((startWidth > maxWidth) || (startHeight > maxHeight))
                {
                    if (startHeight <= startWidth)
                    {
                        if(targetWidth > maxWidth) resizeByWidth = true;
                    }
                    else
                    {
                        if(targetHeight > maxHeight) resizeByHeight = true;
                    }
                }
            }
            else if (maxWidth > 0)
            {
                // Resize within width only
                if (startWidth > maxWidth)
                {
                    if (targetWidth > maxWidth) resizeByWidth = true;
                }
            }
            else if (maxHeight > 0)
            {
                // Resize by height only
                if (startHeight > maxHeight)
                {
                    if (targetHeight > maxHeight) resizeByHeight = true;
                }
            }
            if (resizeByWidth)
            {
                targetWidth = maxWidth;
                targetHeight = (Int32)(startHeight * ((Decimal)targetWidth / (Decimal)startWidth));
            }
            if (resizeByHeight)
            {
                targetHeight = maxHeight;
                targetWidth = (Int32)(startWidth * ((Decimal)targetHeight / (Decimal)startHeight));
            }
        }
    }
    

    然后用类似这样的方式调用它:

    MemoryStream strm = new MemoryStream(returnImage(id, column));
    strm = CreateThumbnail(strm, 100, 100);
    

    【讨论】:

    • hmm...这段代码是巨大的 :) 并且非常混乱...我将如何在我的代码中使用它?
    • 代码可以变得更紧凑,我承认 - 我只是从一个旧项目中获取它,我没有时间为你重写它。您可以通过调用第一个函数来使用它,将您的内存流传递给它,以及您希望图像调整大小的宽度和高度,然后将结果放回您的内存流中。我将添加一个示例。
    猜你喜欢
    • 2011-08-30
    • 2019-07-11
    • 2020-06-11
    • 1970-01-01
    • 2018-11-07
    • 2018-12-19
    • 2018-02-01
    • 2011-03-30
    • 1970-01-01
    相关资源
    最近更新 更多