是否可以使用asp图像标记中的代码生成的位图?

时间:2009-09-02 21:20:49

标签: c# asp.net image

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

3 个答案:

答案 0 :(得分:3)

请参阅此question的内容,了解这种事情的几种不同方法。

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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

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

在您的HTML中,您可以编写像<img src="/images/generated/image-doesnt-physically-exist.jpg" />这样的图像标记,然后仍然可以获取图像。

希望这有助于指明你的方向!