2011-01-05 2 views
2

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

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

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

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

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.

ответ

1

Я считаю, что ваши проблемы с масштабированием, возможно, связаны с изображениями, имеющими другой 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, где вы решили перекрестно разместить сообщение. Не делайте этого в будущем, так как это увеличивает вероятность того, что провода будут пересекаться, и все будут тратить время.

3

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

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 
+0

Спасибо, кажется, работает, за исключением одного: окно с картинкой, которое я использую для предварительного просмотра результирующего изображения, похоже, показывает «измененную, большую» версию изображения. В конце я использовал PictureBox.Image = Результат ... Я не понимаю, почему изображение выглядит так ... – Voldemort

+0

@Omega: Ваши изображения того же размера, что и растровое изображение, которое вы пишете? –

+0

Да, растровое изображение «Результат» - 96x128, а два растровых изображения, которые я использую для тестирования, - 96x128. Тем не менее, окно с картинкой, похоже, увеличивает результат на 2 или что-то в этом роде. – Voldemort

Смежные вопросы