public static void SendPosterToBrowser( PosterBuilder.Builder pb, HttpResponse resp, string posterFilename, PosterBuilder.ImgFormat.SupportedTypes outputFormat) { string filename = BuildFilename(posterFilename, outputFormat); resp.Clear(); // Ensure caching is off naturally resp.CacheControl = "no-cache"; resp.ContentType = PosterBuilder.ImgFormat.ToMimeType(outputFormat); resp.AddHeader("Content-Disposition", "attachment;filename=" + filename); // Call our image with our amendments and have it save to the response so we can send it back Bitmap bmp = pb.Render(); // Have the Poster build our new image and save the result to the outgoing response // ... have to do all this with MemoryStreams as PNG doesn't like being saved directly to HttpResponse.OutputStream // ... may as well do the same for all image types and be consistent using (Bitmap bitmap = pb.Render()) { using (MemoryStream ms = new MemoryStream()) { ImageFormat outFmt = PosterBuilder.ImgFormat.ToImageFormat(outputFormat); bmp.Save(ms, outFmt); ms.WriteTo(resp.OutputStream); } // using ms } // using pb // And of course, clear up after ourselves pb.Dispose(); resp.End(); }