【问题标题】:Is it possible to use a Bitmap generated by code in an asp image tag?是否可以在 asp 图像标签中使用由代码生成的位图?
【发布时间】:2009-09-02 21:20:48
【问题描述】:

我编写了一些代码来创建动态横幅。它返回一个位图变量。有什么方法可以将此变量用作 <asp:Image /> 的 ImageUrl 吗?

这是创建图像的代码:

public class SideImage
{
    protected const int ImgCt = 4;
    protected const int ImgW = 130;
    protected const int ImgH = 150;

    public Bitmap GenerateImage()
    {
        string serializedImage = CreateImage("side");

        if(!string.IsNullOrEmpty(serializedImage))
        {
            using(MemoryStream ms = new MemoryStream(Convert.FromBase64String(serializedImage)))
            {
                Bitmap bitmap = new Bitmap(ms);
                return bitmap;
            }
        }
        return null;
    }

    protected string CreateImage(string path)
    {
        try
        {
            using (Bitmap canvas = new Bitmap(ImgW, (ImgCt * ImgH)))
            {
                using (Graphics canvasGraphic = Graphics.FromImage(canvas))
                {
                    List<FileInfo> fileList = new List<FileInfo>();
                    DirectoryInfo directoryInfo = new DirectoryInfo(HttpContext.Current.Server.MapPath(path + "/"));

                    fileList.AddRange(directoryInfo.GetFiles("*.jpg"));

                    Randomizer<FileInfo> randomizer = new Randomizer<FileInfo>();

                    fileList.Sort(randomizer);

                    int yOffset = 0;
                    for (int i = 0; i <= fileList.Count - 1; i++)
                    {
                        using (Image image = Image.FromFile(fileList[i].FullName))
                        {
                            Rectangle rectangle = new Rectangle(0, yOffset, ImgW, ImgH);
                            canvasGraphic.DrawImage(image, rectangle);
                        }
                        yOffset += ImgH;
                    }

                    ImageCodecInfo[] imageCodecInfo = ImageCodecInfo.GetImageEncoders();
                    using (EncoderParameters encoderParameters = new EncoderParameters(2))
                    {

                        using (MemoryStream memoryStream = new MemoryStream())
                        {
                            encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, 100L);
                            encoderParameters.Param[1] = new EncoderParameter(Encoder.ColorDepth, 16L);

                            canvas.Save(memoryStream, imageCodecInfo[1], encoderParameters);
                            return Convert.ToBase64String(memoryStream.GetBuffer());
                        }
                    }
                }
            }
        }
        catch (Exception ex)
        {
            return null;
        }
    }
}

public class Randomizer<T> : IComparer<T>
{
    protected Random Salter;
    protected int Salt;
    protected SHA1 Sha1;

    public Randomizer()
    {
        Salter = new Random();
        Salt = Salter.Next();
        Sha1 = new SHA1Managed();
    }
    public Randomizer(int seed)
    {
        Salter = new Random(seed);
        Salt = Salter.Next();
        Sha1 = new SHA1Managed();
    }
    private int HashAndSalt(int value)
    {
        byte[] b = Sha1.ComputeHash(BitConverter.GetBytes(value));
        int r = 0;
        for (int i = 0; i < (b.Length - 1); i += 4)
        {
            r = r ^ BitConverter.ToInt32(b, i);
        }
        return r ^ Salt;
    }

    public int Compare(T x, T y)
    {
        return HashAndSalt(x.GetHashCode().CompareTo(HashAndSalt(y.GetHashCode())));
    }
}

【问题讨论】:

    标签: c# asp.net image


    【解决方案1】:

    查看question 的内容,了解处理此类事情的几种不同方法。

    (显然我更喜欢我的;))。

    【讨论】:

      【解决方案2】:

      这听起来类似于图表生成器的工作方式。我见过两种方法。一种是在服务器上创建一个文件,然后指向该文件。另一种是将位图存储在内存中,然后调用一个aspx页面代替图像。 ASP 页面会从内存中读取位图并返回给浏览器。

      【讨论】:

      • 好的,我认为这就是我以前在 VB.NET 中所做的。谢谢!
      【解决方案3】:

      我会创建一个 HTTP 模块来执行此操作。

      例如,您可以设置 HTTP 模块来拦截对特定文件夹('/images/generated/')的所有请求。

      然后,当您收到对该文件夹中图像的请求时,将调用您的 HTTP 模块中的代码。在内存中创建图像并将其写入 Response 对象(首先设置任何适当的 MIME 类型标头和内容)。

      然后你可以在你的 HTML 中写一个像 &lt;img src="/images/generated/image-doesnt-physically-exist.jpg" /&gt; 这样的图像标签,仍然可以得到一个图像。

      希望能帮助您指明正确的方向!

      【讨论】:

      • 在这种情况下,HttpHandler 会是更好的选择,而不是 HttpModule。
      猜你喜欢
      • 2019-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多