Объединение двух изображений PNG в одно изображение с использованием .NET - PullRequest
2 голосов
/ 06 января 2011

У меня в приложении два (на самом деле много) PNG (.png) изображения. У обоих есть прозрачные области здесь и там.

Я хочу в своем приложении взять оба изображения, объединить их и отобразить результат в графическом окне. Позже я хочу сохранить результат через кнопку.

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

Вот немного моего кода:

    Dim Result As New Bitmap(96, 128)
    Dim g As Graphics = Graphics.FromImage(Result)
    Dim Name As String
    For Each Name In BasesCheckList.CheckedItems
        Dim Layer As New Bitmap(resourcesPath & "Bases\" & Name)
        For x = 0 To Layer.Width - 1
            For y = 0 To Layer.Height - 1
                Result.SetPixel(x, y, Layer.GetPixel(x, y))
            Next
        Next
        Layer = Nothing
    Next

resourcesPath - это путь к моей папке с ресурсами. Bases - это папка в нем. И Name - имя изображения.

Ответы [ 2 ]

3 голосов
/ 06 января 2011

Проблема в том, что вы пытаетесь сделать это вручную. Не. Существует множество библиотечных процедур для рисования изображений, и они знают, как правильно управлять прозрачностью.

Dim Result As New Bitmap(96, 128)
Dim g As Graphics = Graphics.FromImage(Result)
Dim Name As String
For Each Name In BasesCheckList.CheckedItems
    Dim Layer As New Bitmap(resourcesPath & "Bases\" & Name)
    g.DrawImageUnscaled(Layer, 0, 0);
    Layer = Nothing
Next
1 голос
/ 06 января 2011

Я полагаю, что ваши проблемы с масштабированием могут быть связаны с изображениями с другим DPI. Если это так, вам действительно нужно DrawImage () , потому что он будет масштабировать изображения, чтобы они соответствовали DPI объекта Graphics . Одно предостережение: если вы не предоставите размер для DrawImage () , то по той же причине он будет делать DrawImageUnscaled () .

Dim result As New Bitmap(96, 128)

Dim directoryName As String = String.Format("{0}Bases", resourcesPath)
Using g As Graphics = Graphics.FromImage(result)
    For Each imageName As String In BasesCheckList.CheckedItems
        Dim fileName As String = IO.Path.Combine(directoryName, imageName)
        Using layer As New Bitmap(fileName)
            g.DrawImage(layer, 0, 0, 96, 128)
        End Using
    Next
End Using

Более подробное обсуждение можно найти на форуме Xtreme VB Talk, где вы решили сделать кросс-пост. Не делайте этого в будущем, поскольку это увеличивает вероятность того, что провода будут пересечены, и все будут тратить время.

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