从多个重叠的PNG创建JPEG

4
在我的网站上,用户可以创建一个头像。用户通过选择多个图像来创建头像;有一个基本的“皮肤”图像和覆盖在该图像上的png文件,这些文件描绘了头发、眼睛、嘴巴等部位。
我无法将用户的头像保存到项目文件中,因此用户的头像数据存储在数据库中,png文件在运行时重叠并显示给用户。
然而,我希望用户能够通过转到一个页面来下载他们的头像作为jpeg格式的文件。
我已经设置了一个小的示例,它可以正确地工作:
但是,正如你所看到的,我仅在单个图像上使用它。我想从多个png文件中创建位图并输出jpeg文件。
有人可以帮忙吗?
2个回答

5

您可以将图像叠加绘制。PNG图像的透明度会被正确处理,但由于JPEG图像没有任何透明度,因此您需要一个背景色来进行绘制。

请记得小心妥善处理Graphics和Bitmap对象。它们甚至不推荐在Web应用程序中使用...

// create image to draw on
using (Bitmap bit = new Bitmap(80, 106)) {
  // fill with background
  bit.Clear(Color.White);
  // images to load
  string[] skins = new string[] { "skin1.png", "eyes3.png", "mouth8.png" };
  // create graphics object for drawing on the bitmap
  using (Graphics g = Graphics.FromImage(bit)) {
    foreach (string skin in skins) {
      // load image
      using (Image skinImage = Image.FromFile(Server.MapPath("/images/" + skin)) {
        // draw image
        g.DrawImage(skinImage, 0, 0, 80, 106);
      }
    }
  }
  Response.ContentType = "image/jpeg";
  bit.Save(Response.OutputStream, ImageFormat.Jpeg);
}

3

我认为当你需要重叠图片时,可以考虑使用Graphics.FromImage。假设没有特殊效果(只是简单地重叠和定位每个图层),你可以像这样实现:

Graphics gfxAvatar = Graphics.FromImage(bit) //bit is your base image

gfxAvatar.DrawImage(secondLayer, new Point(X,Y)); //Draw secondLayer at X, Y

接下来对其他图层进行同样的操作。(由于有多个图层,可能更快的方法是在初始的Graphics gfxAvatar部分周围使用一个Using循环。)完成后,您可以使用bit.Save方法将其转换为JPG格式。


1
需要注意的一件事是GDI+是否能够正确处理/渲染透明PNG图像。如果不能,则需要选择透明颜色并将图像呈现为透明位图。 - user113476
非常好的观点!楼主可能想看一下http://msdn.microsoft.com/en-us/library/ms172507.aspx - keyboardP

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接