Carloz Posted December 18, 2006 at 11:57 PM Report #71288 Posted December 18, 2006 at 11:57 PM 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 "Rejoice not against me, O mine enemy: when I fall, I shall arise; when I sit in darkness, the LORD shall be a light unto me." - Micah 7:8 (KJV)
marinheiro Posted December 19, 2006 at 12:17 AM Report #71292 Posted December 19, 2006 at 12:17 AM 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... há 10 tipos de pessoas: as que sabem binário e as que não sabem... todas as nossas vidas não passam de release candidates... com o aperfeiçoamento, um dia chegaremos à versão final..
Guest id194 Posted December 19, 2006 at 01:05 AM Report #71302 Posted December 19, 2006 at 01:05 AM ya, usa o resource depois podes aceder às imagens atraves de My.Resources ou se for em run-time, acedes facilmente a isso...
Carloz Posted December 20, 2006 at 02:29 PM Author Report #71533 Posted December 20, 2006 at 02:29 PM 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 "Rejoice not against me, O mine enemy: when I fall, I shall arise; when I sit in darkness, the LORD shall be a light unto me." - Micah 7:8 (KJV)
Guest id194 Posted December 20, 2006 at 05:25 PM Report #71578 Posted December 20, 2006 at 05:25 PM 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.
Carloz Posted December 20, 2006 at 06:14 PM Author Report #71592 Posted December 20, 2006 at 06:14 PM 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 👍 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. "Rejoice not against me, O mine enemy: when I fall, I shall arise; when I sit in darkness, the LORD shall be a light unto me." - Micah 7:8 (KJV)
Guest id194 Posted December 21, 2006 at 02:11 AM Report #71682 Posted December 21, 2006 at 02:11 AM 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 👍
inginheiiro Posted December 21, 2006 at 09:41 AM Report #71702 Posted December 21, 2006 at 09:41 AM 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 I used to have a life ... but i bought a programmable machine in 1982 ...
Carloz Posted December 21, 2006 at 06:13 PM Author Report #71775 Posted December 21, 2006 at 06:13 PM 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 "Rejoice not against me, O mine enemy: when I fall, I shall arise; when I sit in darkness, the LORD shall be a light unto me." - Micah 7:8 (KJV)
Guest id194 Posted December 21, 2006 at 11:11 PM Report #71828 Posted December 21, 2006 at 11:11 PM 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
Carloz Posted December 22, 2006 at 12:09 AM Author Report #71846 Posted December 22, 2006 at 12:09 AM 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. "Rejoice not against me, O mine enemy: when I fall, I shall arise; when I sit in darkness, the LORD shall be a light unto me." - Micah 7:8 (KJV)
inginheiiro Posted December 22, 2006 at 09:52 AM Report #71881 Posted December 22, 2006 at 09:52 AM "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 I used to have a life ... but i bought a programmable machine in 1982 ...
Guest id194 Posted December 22, 2006 at 02:42 PM Report #71934 Posted December 22, 2006 at 02:42 PM 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.
Carloz Posted December 22, 2006 at 04:36 PM Author Report #71961 Posted December 22, 2006 at 04:36 PM 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 "Rejoice not against me, O mine enemy: when I fall, I shall arise; when I sit in darkness, the LORD shall be a light unto me." - Micah 7:8 (KJV)
Carloz Posted December 23, 2006 at 03:24 AM Author Report #72079 Posted December 23, 2006 at 03:24 AM 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 "Rejoice not against me, O mine enemy: when I fall, I shall arise; when I sit in darkness, the LORD shall be a light unto me." - Micah 7:8 (KJV)
Carloz Posted December 23, 2006 at 02:23 PM Author Report #72119 Posted December 23, 2006 at 02:23 PM Boas Aqui fica o resultado final para quem quiser ver: Tópico "Rejoice not against me, O mine enemy: when I fall, I shall arise; when I sit in darkness, the LORD shall be a light unto me." - Micah 7:8 (KJV)
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now