• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Sign in to follow this  
Followers 0
Ziwdon

[Visual Basic 2005] Incluir imagens no .exe

16 posts in this topic

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

0

Share this post


Link to post
Share on other sites

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...

0

Share this post


Link to post
Share on other sites

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

0

Share this post


Link to post
Share on other sites

Ok...antes de mais obrigado por responderem.

Agora é o seguinte...eu tinha o seguinte código para colocar a IMAGEM.JPG na picturebox:

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:

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

0

Share this post


Link to post
Share on other sites

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.

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.

0

Share this post


Link to post
Share on other sites

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:

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:

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:

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.

0

Share this post


Link to post
Share on other sites

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:

0

Share this post


Link to post
Share on other sites

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

0

Share this post


Link to post
Share on other sites

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

0

Share this post


Link to post
Share on other sites

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

0

Share this post


Link to post
Share on other sites

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.

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

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.

0

Share this post


Link to post
Share on other sites

"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

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

0

Share this post


Link to post
Share on other sites

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.

0

Share this post


Link to post
Share on other sites

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:

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

0

Share this post


Link to post
Share on other sites

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:

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:

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

0

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0