繁体   English   中英

是否可以在ASP图像标签中使用由代码生成的位图?

[英]Is it possible to use a Bitmap generated by code in an asp image tag?

我已经编写了一些代码来创建动态横幅。 它返回一个位图变量。 有什么方法可以将此变量用作<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())));
    }
}

有关此问题的几种不同方法,请参见此问题的内容。

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

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

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

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

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

然后,您可以在HTML中编写一个图像标签,例如<img src="/images/generated/image-doesnt-physically-exist.jpg" />然后仍然可以获取图像。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM