VB .NET - Como incluir um texto e/ou imagem como marca d'água em uma Imagem


 Neste artigo eu vou mostrar uma forma de incluir um texto ou uma imagem como marca d'água em uma imagem numa aplicação Windows Forms usando a linguagem VB .NET.

As marcas d'água são textos ou imagens que aparecem sob o texto de um documento. Elas normalmente adicionam um atrativo ou identificam o status do documento, como marcando um documento como um rascunho ou incluindo um marca de propriedade à imagem.

Neste artigo eu vou criar um projeto exemplo que mostrar como podemos incluir texto ou imagem como marca d'água em uma outra imagem podendo depois salvá-la com a marca d'água inserida.

Recursos Usados :

Criando o projeto no Visual Studio 2013 Express for Windows Desktop

Abra o VS Express 2013 for Windows Desktop e clique em New Project;

A seguir selecione a linguagem Visual VB.NET e o template Windows Forms Application;

Informe o nome MarcaDagua_VBNET e clique no botão OK;

A seguir selecione o  formulário padrão form1.vb e inclua, a partir da ToolBox, os seguintes controles:

Disponha os controles no formulário conforme a figura abaixo:

Na controle PictureBox picImagemMarcaDagua no topo do formulário você deve incluir uma imagem que será usada como marca d'água em outra imagem.

No meu exemplo eu estou usando o o logotipo Macoratti.net.

Agora vamos definir o código do formulário.

1- No evento Load vamos carregar as fontes instaladas no sistema chamando a rotina carregarFontes:

 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        carregarFontes()
 End Sub

A rotina carregarFontes possui o seguinte código:

    Private Sub carregarFontes()
        Try
            Dim fontes_Instaladas As New InstalledFontCollection
            cboFontes.Items.Clear()
            For Each font_family As FontFamily In fontes_Instaladas.Families
                cboFontes.Items.Add(font_family.Name)
            Next font_family
            cboFontes.SelectedIndex = 0
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub

No evento Click do botão Carregar Imagem temos o código que carrega uma imagem no controle picImagem:

Private Sub btnCarregarImagem_Click(sender As Object, e As EventArgs) Handles btnCarregarImagen.Click
        Try
            Dim openfiledialog As New OpenFileDialog
            If openfiledialog.ShowDialog = DialogResult.OK Then
                picImagem.Image = Image.FromFile(openfiledialog.FileName)
            End If
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
End Sub

No evento Click  do botão Aplicar Texto inclua o código que obtém o texto, os valores das coordenadas, o tamanho da fonte e a fonte e aplica o texto na imagem carregada:

 Private Sub btnAplicarTexto_Click(sender As Object, e As EventArgs) Handles btnAplicarTexto.Click
        Try
            Dim x As Integer = Convert.ToInt32(txtX.Text)
            Dim y As Integer = Convert.ToInt32(txtY.Text)
            Dim tam As Integer = Convert.ToInt32(txtTamanho.Text)
            Dim NF As New Font(cboFontes.Text, tam, FontStyle.Bold)
            Dim NB As New SolidBrush(Color.FromArgb(64, 192, 255, 255))
            NB.Color = Color.FromArgb(128, 0, 0, 0)
            picImagem.CreateGraphics.DrawString(txtTexto.Text, NF, NB, x, y)
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
 End Sub

No botão Aplicar Imagem temos o código que aplica a imagem definida em picImagemMarcaDagua na imagem centralizando ou  não a imagem conforme a seleção do usuário no controle chkCentralizar :

Private Sub btnAplicarImagem_Click(sender As Object, e As EventArgs) Handles btnAplicarImagem.Click
        ' a imagem que será usada como marca d'agua
        Dim bm_marcaDagua As New Bitmap(picImagemMarcaDagua.Image)
        ' a imagem onde iremos aplicar a marca dágua
        Dim bm_Resultado As New Bitmap(picImagem.Image)
        'centraliza a marca d'agua
        If chkCentralizar.Checked Then
            Dim x As Integer = (bm_Resultado.Width - bm_marcaDagua.Width) \ 2
            Dim y As Integer = (bm_Resultado.Height - bm_marcaDagua.Height) \ 3
            DesenharMarcaDagua(bm_marcaDagua, bm_Resultado, x, y)
        Else
            'define a marca d'agua em uma posição especifica
            Dim x As Integer = Convert.ToInt32(txtX.Text)
            Dim y As Integer = Convert.ToInt32(txtY.Text)
            DesenharMarcaDagua(bm_marcaDagua, bm_Resultado, x, y)
        End If
        picImagem.Image = bm_Resultado
End Sub

O código da rotina DesenharMarcaDagua que aplica a imagem como marca d'água é visto abaixo:

Private Sub DesenharMarcaDagua(ByVal bm_marcaDagua As Bitmap, ByVal bm_Resultado As Bitmap, ByVal x As Integer, ByVal y As Integer)
        Const ALPHA As Byte = 128
        ' Define o componente Alpha do pixel
        Dim clr As Color
        For py As Integer = 0 To bm_marcaDagua.Height - 1
            For px As Integer = 0 To bm_marcaDagua.Width - 1
                clr = bm_marcaDagua.GetPixel(px, py)
                bm_marcaDagua.SetPixel(px, py, Color.FromArgb(ALPHA, clr.R, clr.G, clr.B))
            Next px
        Next py
        ' Define a marca dagua como transparente
        bm_marcaDagua.MakeTransparent(bm_marcaDagua.GetPixel(0, 0))
        ' Copia o resultado na imagem
        Dim gr As Graphics = Graphics.FromImage(bm_Resultado)
        gr.DrawImage(bm_marcaDagua, x, y)
 End Sub

No botão Salvar Imagem temos o código a seguir que salva a imagem resultante:

Private Sub btnSalvarImagem_Click(sender As Object, e As EventArgs) Handles btnSalvarImagem.Click
        Try
            ' a imagem onde iremos aplicar a marca dágua
            Dim pic_Resultado As New Bitmap(picImagem.Image)
            svd1.ShowDialog()
            pic_Resultado.Save(svd1.FileName)
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub

Executando o  projeto iremos obter o seguinte resultado:

Pegue o projeto completo aqui :  MarcaDagua_VBNET.zip

Salmos 8:1 - Ó Senhor, Senhor nosso, quão admirável é o teu nome em toda a terra, pois puseste a tua glória sobre os céus!
Salmos 8:2 - Tu ordenaste força da boca das crianças e dos que mamam, por causa dos teus inimigos, para fazer calar ao inimigo e ao vingador.
Salmos 8:3 - Quando vejo os teus céus, obra dos teus dedos, a lua e as estrelas que preparaste;
Salmos 8:4 - Que é o homem mortal para que te lembres dele? e o filho do homem, para que o visites?

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti