Создание JPEG из нескольких перекрывающихся PNG - PullRequest
4 голосов
/ 18 января 2010

Так что на моем сайте у пользователя есть возможность создать аватар.Он создается пользователем, выбирающим из нескольких изображений;есть базовое изображение «skin» и png, которые перекрывают это изображение с изображением волос, глаз, рта и т. д.

Я не могу сохранить аватар пользователя в файлы проекта, поэтому данные аватара пользователя хранятся вбаза данных и png перекрываются на лету и отображаются для пользователя.

Однако мне бы хотелось, чтобы пользователь мог загружать свои аватары в формате jpeg, переходя на страницу.

У меня есть небольшой пример, который работает правильно:

protected void Page_Load(object sender, EventArgs e)
{
    //User has skin1.png, eyes3.png, and mouth8.png
    Bitmap bit = new Bitmap(System.Drawing.Image.FromFile(Server.MapPath("/images/skin1.png")), 80, 106);

    Response.ContentType = "image/jpeg";
    bit.Save(Response.OutputStream, ImageFormat.Jpeg);
}

Но, как вы видите, у меня это работает только для одного изображения.Я хотел бы создать растровое изображение из нескольких PNG и вывести JPEG.

Может кто-нибудь помочь?

Ответы [ 2 ]

5 голосов
/ 18 января 2010

Вы можете просто нарисовать изображения друг на друге. Прозрачность изображений PNG обрабатывается правильно, но поскольку изображения JPEG не имеют никакой прозрачности, вы хотите, чтобы цвет фона рисовался.

Помните, что нужно правильно распоряжаться объектами Graphics и Bitmap. Их даже не рекомендуется использовать в веб-приложении ...

// 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 голосов
/ 18 января 2010

Я думаю, вы хотите посмотреть Graphics.FromImage , когда вы перекрываете изображения. Я предполагаю, что нет никаких специальных эффектов (просто перекрытие и расположение каждого слоя). Таким образом, вы можете получить что-то вроде этого:

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

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

Продолжите это с другими слоями. (Возможно, будет быстрее создать цикл Using вокруг начального раздела Graphics gfxAvatar, поскольку имеется несколько слоев. Затем, как только это будет сделано, вы можете преобразовать его в JPG, используя метод bit.Save.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...