Ir para conteúdo


Revista PROGRAMAR - Edição 45 (Maio 2014): Download já disponível! Visita também o novo website da revista.

- - - - -

[Visual Basic 2005] Incluir imagens no .exe


  • Por favor inicie sessão para responder
15 respostas a este tópico

#1 Ziwdon

Ziwdon

    CRLF

  • Membro
  • PipPipPipPipPip
  • 823 mensagens

Publicado 19 de Dezembro de 2006 - 00:57

Boas.
Eu estou a fazer um programa no qual uso imagens. Eu tenho as imagens numa pasta no disco e para recorrer a elas faço "ImageLocation(path)".
Existe alguma maneira para incluir as imagens no ficheiro .exe? Ou seja, sem ter de recorrer as imagens no disco?
Ja corri varios programas em que sao usadas imagens e não têm nenhuma pasta à parte com as mesmas, por isso deve haver maneira de as incluir no .exe.


Obrigado

#2 marinheiro

marinheiro

    CRLF

  • Membro
  • PipPipPipPipPip
  • 840 mensagens

Publicado 19 de Dezembro de 2006 - 01:17

cria um ficheiro de resource e chama-o no programa... quando for compilado, as imagens são inseridas no executavel... atenção que, às vezes, o vb transform jpg's em bmp's , o que aumenta substancialmente o tamanho do executável...

#3 Nazgulled

Nazgulled

    Unsigned User

  • Membro
  • PipPipPipPipPipPip
  • 4091 mensagens

Publicado 19 de Dezembro de 2006 - 02:05

ya, usa o resource depois podes aceder às imagens atraves de My.Resources ou se for em run-time, acedes facilmente a isso...

#4 Ziwdon

Ziwdon

    CRLF

  • Membro
  • PipPipPipPipPip
  • 823 mensagens

Publicado 20 de Dezembro de 2006 - 15:29

Ok...antes de mais obrigado por responderem.
Agora é o seguinte...eu tinha o seguinte código para colocar a IMAGEM.JPG na picturebox:

Código (vb.net):
Dim pic As Boolean
        Dim img As String
        img = "C:\IMAGEM.JPG"
        PictureBox.ImageLocation = img

        If PictureBox.ImageLocation = img Then pic = True

Mas como quer usar os resources, ou seja, incluir a imagem no programa, tive de alterar para o seguinte:

Código (vb.net):
Dim pic As Boolean
        Dim img As System.Drawing.Image
        img = My.Resources.IMAGEM

        If PictureBox.Image.Equals(img) Then pic = True

Tive de substituir "If PictureBox.Image = img" por "If PictureBox.Image.Equals(img)" uma vez que dava um erro a dizer que o "=" não era suportado ou qualquer coisa do género.

O problema é que agora dá-me outro erro...

"NullReferenceException was unhandled!
Object reference not set to an instance of an object."


Alguem me sabe explicar que erro é e se é possivel corrigir? Ou então existe alguma maneira de fazer o que tenho no 1º código mas usando os resources?


Agradeço a vossa ajuda.
Fiquem bem

#5 Nazgulled

Nazgulled

    Unsigned User

  • Membro
  • PipPipPipPipPipPip
  • 4091 mensagens

Publicado 20 de Dezembro de 2006 - 18:25

Não tou a perceber bem o que estás prai a tentar fazer... Para que serve esse If ai? O que faz? Para que queres uma variável "pic" de controlo? Que te interessa saber se é verdadeiro ou falso?

E no segundo exemplo, com os resources, não te vejo a adicionar a imagem dos resources à picturebox.

Código (vb.net):
PictureBox1.Image = My.Resources.IMAGEM

Isto não basta? Desde que a imagem com o nome IMAGEM esteja nos resources e a adiciones à PictureBox, então elá está lá e não precisas de ter um If para verificar isso... Mas digo isto sem perceber exactamente o que queres fazer.

#6 Ziwdon

Ziwdon

    CRLF

  • Membro
  • PipPipPipPipPip
  • 823 mensagens

Publicado 20 de Dezembro de 2006 - 19:14

Pois...é que eu só postei a parte que me está a dar problemas. O programa é enorme e para nao estar a postar tudo postei só isso.
Há um certo ponto no programa que ele faz algo semelhante a:

Código (vb.net):
If PictureBox.Image.Equals(img) Then pic = True

foi por isso que postei o IF.
Quanto ao facto de nao ter adicionado a imagem à picturebox no 2º exemplo foi pura e simplesmente porque me esqueci :thumbsup:
Aqui fica o codigo correcto:

Código (vb.net):
Dim bothpics As Boolean
        Dim img As System.Drawing.Image
        Dim img2 As System.Drawing.Image
        img = My.Resources.IMAGEM
        img2 = My.Resources.IMAGEM2

        PictureBox.Image = img
        If PictureBox.Image.Equals(img) And PictureBox2.Image.Equals(img2) Then bothpics = True

Isto é o que estou a tentar fazer...mas ele dá o tal erro no If.
Se substituir o "equals" por "=" dá o tal erro do igual.

O problema é que eu fiz o programa todo em função das imagens que tinha no disco, ou seja, do seguinte modo:

Código (vb.net):
Dim bothpics As Boolean
        Dim img As string
        Dim img2 As string
        img = "C:\IMAGEM"
        img2 = "C:\IMAGEM"

        PictureBox.ImageLocation = img
        If PictureBox.Image = img And PictureBox2.Image = img2 Then bothpics = True

E agora queria fazer o mesmo mas com as imagens que tenho nos recursos, mas nao estou a conseguir.

#7 Nazgulled

Nazgulled

    Unsigned User

  • Membro
  • PipPipPipPipPipPip
  • 4091 mensagens

Publicado 21 de Dezembro de 2006 - 03:11

Esquecendo o código que aqui está, explica da melhor forma o que tu queres mesmo fazer. Sem falar em linguagens e em código, o que pretendes programar? (não o programa todo, mas este bocado)

Eu não estou a conseguir entender o que queres, por isso te peço pa explicares melhor o que pretendes, se alguem te conseguir ajudar ate la, optimo para ti :thumbsup:

#8 inginheiiro

inginheiiro

    Try-Catch User

  • Membro
  • PipPipPipPip
  • 264 mensagens

Publicado 21 de Dezembro de 2006 - 10:41

1- inclui a imagem no projecto
2-muda a propriedade para embeded resource

vai buscar a imagem ( um icon por exemplo) (isto em c#).
3- Icon i = new Icon (typeof(MainForm).Assembly.GetManifestResourceStream("Pop3MailChecker.Icons.Get Mail.ico"))

vai buscar a imagem ( um icon por exemplo) (isto em vb).
3-Dim i As Icon = New Icon(GetType(MainForm).Assembly.GetManifestResourceStream("Pop3MailChecker.Icons.Get Mail.ico"))


MainForm é o nome da minha form.
Pop3MailChecker é o nome do meu projecto.
Icons pq o icon que inclui no projecto encontra-se no directorio Icons
Get Mail.ico nome do icon que quero ir buscar ao resource.

/ing

#9 Ziwdon

Ziwdon

    CRLF

  • Membro
  • PipPipPipPipPip
  • 823 mensagens

Publicado 21 de Dezembro de 2006 - 19:13

Mais uma vez, obrigado por responderem.

Nazgulled, o que eu quero é mais ou menos o seguite:
Tenho duas picturebox, e quero atribuir a cada uma delas uma imagem que tenho guardada nos recursos.
Depois quero que o programa compare as duas imagens (araves do IF) e verifique se sao iguais.

inginheiiro, segui as tuas instrucções e quase quase que resultou. Mas agora está a dar uma outra Exception...diz:

"InvalidOperationException was unhandled.
An error occurred creating the form. See Exception.InnerException for details.  The error is: Value of 'null' is not valid for 'stream'."


Deve ser alguma coisa no código, mas como este é muito extenso não consigo perceber o que é...mas sei que está relacionado com:

"Dim i As Icon = New Icon(GetType(MainForm).Assembly.GetManifestResourceStream("Pop3MailChecker.Icons.Get Mail.ico"))"


Não há nenhuma maneira de me referir aos recursos através de um "path"? Como se estivessem num directório?
É que assim em vez de Picturebox.Image.equals(IMAGEM) já podia por Picturebox.ImageLocation = Path da IMAGEM.

Estão a perceber?...eu sei que isto é um pouco confuso, mas tento explicar o melhor que consigo.

Mais uma vez obrigado por responderem.
Diquem bem

#10 Nazgulled

Nazgulled

    Unsigned User

  • Membro
  • PipPipPipPipPipPip
  • 4091 mensagens

Publicado 22 de Dezembro de 2006 - 00:11

Tive a pesquisar um pouco e cheguei à conclusão que não podes comparar assim tão facilmente duas imagens em .NET usando o = por exemplo.

Tens duas hipoteses:

1) Comparas a cor do pixel da posixão x,y em ambas as imagens em todos os pixeis.
2) Calculas a hash para cada uma das imagens e comparas a hash.

O segundo metodo pode dar mais trabalho a programar, mas é o + rapido em termos de comparação.

Vê isto: http://www.codeproject.com/dotnet/comparingimages.asp

#11 Ziwdon

Ziwdon

    CRLF

  • Membro
  • PipPipPipPipPip
  • 823 mensagens

Publicado 22 de Dezembro de 2006 - 01:09

hmm...antes de mais obrigado por desperdiçares o teu tempo comigo :(
Sou capaz de te ter dado a ideia errada do que quero. Eu quando disse comparar não era mesmo comparar, ou seja era, mas de outro modo.
O que eu estou a fazer é o jogo do galo. Tenho a imagem bola e a imagem cruz e fiz o código da seguinte maneira.

Código (vb.net):
Dim Dirbola as string
Dirbola = "C:\bola.jpg"
Picbox1.ImageLocation = Dirbola

Ora...para verificar se na casa 1, 2, e 3 estão 3 bolas fiz um

Código (vb.net):
If picbox1.ImageLocation = Dirbola and picbox2.ImageLocation = Dirbola_
 and picbox3.ImageLocation = Dirbola then statuslabel.text = "Win"

Ora...só depois de ter isto feito é que decidi por as imagens nos recursos. (mal)
O problema, é que as imagens nos recursos não têm path (que eu saiba) e não posso atribuir nada à Image.Location porque é string.

Então em vez de ImageLocation pus Image...e foi quando começaram a surgir problemas.
Como o inginheiiro disse até estava a resultar, mas depois começou a dar o erro "InvalidOperationException was unhandled.".
O problema está na declaração da variavel DIRbola que não sei de que tipo deve ser, uma vez que com os system.drawing.bitmap e coisas do genero nao da para fazer a parte do IF.

#12 inginheiiro

inginheiiro

    Try-Catch User

  • Membro
  • PipPipPipPip
  • 264 mensagens

Publicado 22 de Dezembro de 2006 - 10:52

Ver MensagemButtpt, em 21 de Dezembro de 2006 - 19:13, disse:

"InvalidOperationException was unhandled.
An error occurred creating the form. See Exception.InnerException for details.  The error is: Value of 'null' is not valid for 'stream'."


Isto pq não encontrou a imagem no resource.

testa antes tipo :
dim i as icon
Dim str As Stream = (GetType(MainForm).Assembly.GetManifestResourceStream("Pop3MailChecker.Icons.Get Mail.ico"))
if (not (str is Nothing))
  i=ne Icon(str)



1- inclui a imagem no projecto.
2-muda a propriedade da imagem incluida no projecto pra para embeded resource



A Path dos recursos é o nome da DLL/Executavel.Nome da imagem.extensão.
Tipo se o teu projecto compila um ficheiro chamada aaa.exe, e a tua main forma tem o nome de yyy, e tu incluis um resource chamada zzz.icon,
a path é aaa.zz.icon e vais busca-la

new Icon(GetType(yyy).Assembly.GetManifestResourceStream("aaa.zzz.ico"))

se por acaso o recurso que incluis no teu projecto está num directorio chamado icons e este mesmo directorio está incluido no teu projecto, então vais busca-la assim:

new Icon(GetType(yyy).Assembly.GetManifestResourceStream("aaa.icons.zzz.ico"))

TENS QUE TER EM ATENÇÃO QUE O NOME DAS COISAS É CASE SENSITIVE.

um recurso chamado aaa.ico é diferente de um recurso chamado Aaa.ico

Citar

Não há nenhuma maneira de me referir aos recursos através de um "path"? Como se estivessem num directório?

Podes em vez de adicionar os resources ao teu exe como embeded, ir busca-los tipo:
1.fazes um directorio na path do teu executavel chamado IMG e colocas lá dentro o ficheiro aaa.gif
2. No teu codigo vais buscar a path onde está a correr a tua app:

Private _Path As String = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly.GetName.CodeBase).Replace("file:\", "")

3. adicionas o caminho do teu directorio e defines o nome da imagem.

_Path=_PAth+"\IMG"
dim file as string= _Path+"\aaa.gif";
Dim p1 As System.Windows.Forms.PictureBox


4. testa a existencia e vais buscar...
if (System.IO.File.Exists(file)) then
p1.Image = New Bitmap(file)
end if



/ing

#13 Nazgulled

Nazgulled

    Unsigned User

  • Membro
  • PipPipPipPipPipPip
  • 4091 mensagens

Publicado 22 de Dezembro de 2006 - 15:42

Mas para quê complicar? Nunca programei o jogo de o galo, mas se o fizesse, usava uma pequena matriz de 3x3 e guardava la as jogadas dos jogadores, por exemplo 1 para bola e 2 para a cruz e depois era só comprar inteiros. O que provavelmente será mais eficaz e rápido do que aquilo que estás a fazer... Talvez a diferença não se note mas pronto.

#14 Ziwdon

Ziwdon

    CRLF

  • Membro
  • PipPipPipPipPip
  • 823 mensagens

Publicado 22 de Dezembro de 2006 - 17:36

OK...tentei como o inginheiiro disse (das duas maneiras) mas continua a da um erro a dizer "NullReferenceException: Object reference not set to an instance of an object."...e depois diz para usarmos a new keyword e nao sei que. Mas eu não percebo porque a new keyword está la...um erro que nao percebo e que me acontece varias vezes em varios programas (as vezes até naqueles sources que saco da net para os estudar e experimentar da esse erro).
O problema do IF já resolvi...usei List's.
Mas continuo a nao conseguir associar uma imagem dos recursos a uma variavel.

No solution explorer tenho o seguinte:

JogoGalo
- My Project
- Images
      - bola.jpg
      - cruz.jpg
- Credits.vb
- TicTacToe.vb
- TicTacToeAbout.vb

depois na declaraçao das variaveis meto:

Código (vb.net):
Dim Dirbola As Bitmap = New Bitmap(GetType(TicTacToe).Assembly.GetManifestResourceStream("JogoGalo.Images.bola.jpg"))

e dá aquele erro do value null. O que estou a fazer mal?


Obrigado e fiquem bem

#15 Ziwdon

Ziwdon

    CRLF

  • Membro
  • PipPipPipPipPip
  • 823 mensagens

Publicado 23 de Dezembro de 2006 - 04:24

Boas
É só para avisar que já consegui resolver o problema.
Para associar o resource à variavel fui às prorpiedades do My Project, fui aos Resources e adicionei a imagem.
Depois fiz:

Código (vb.net):
Dim Dirbola As Bitmap = My.Resources.bola

Quanto ao problema do IF resolvi-o com recurso às List's.
Por exemplo, se a casa 1 tem uma imagem bola, entao List_bola.add(1)...o mesmo para a cruz.
Depois para verificar se existem imagens nas casas faço:

Código (vb.net):
If list_bola.contains(1) and list_bola.contains(2) and list_bola.contains(3) then statuslabel.text = "WIN".

Muito obrigado aos dois pela paciencia, tempo perdido e ajuda.
Em breve postarei o jogo nos projectos aqui no forum.

Obrigado e fiquem bem

#16 Ziwdon

Ziwdon

    CRLF

  • Membro
  • PipPipPipPipPip
  • 823 mensagens

Publicado 23 de Dezembro de 2006 - 15:23

Boas

Aqui fica o resultado final para quem quiser ver: Tópico