transparentný picture (sprite)   zodpovězená otázka

VB.NET

Dobrý deň, potreboval by som na fotografie v pozadí, presúvať (dopĺňať) jednotlivé predmety. Niečo ako kompozícia...Problém:

Netuším, ako transparentne prekresliť obraz, cez iný obraz. A navyše tak, že tam neostane nastálo, ale bude sa s ním hýbať.

Len predpokladám, že to nieje možné (a určite nie je ideálne) v jednom PictureBoxe.

Poprosil by som o ukážkový kód, ako na to.

P.S: Visual Studio 2008 Express, Windows XP SP3

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Jaký máte zdroj, takový bude výsledek. Vykreslení obrázku zde najdete:

Dim b as new bitmap(200,200)
using g as graphics = graphics.fromimage(b)
    g.drawimage(image.fromfile(""),0,0)
end using

Vtip je v tom, že zdrojový soubor musí být něco, co podporuje alpha kanál. Nejlépe 32Bpp PNG.

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Připojuji se, pokud vykreslíte normální metodou obrázek, který má zakomponovanou průhlednost PNG, GIF....atp., promítne se to i tam, kam kreslíte. Pokud byste chtěl nastavit některé pixely v daném obrázku jako průhledné dynamicky, využijte Color.FromArgb:

mujObrazek.SetPixel(x_pozice, y_pozice, Color.FromArgb(pruhlednost, cervena, zelena, modra))

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Ďakujem za pokus o nasmerovanie. Na tento, alebo podobný kód som natrafil aj v článkoch a tutoriáloch tohoto WEBu.

ale...

Tu je pre jednoduchosť jediný kód ktorý som vložil, spustil a nezobrazí sa mi NIČ

Tlačítko som použil iba pre 300% overenie správnosti adresy. Takže chyba je niekde inde.

Public Class Form1
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim b As New Bitmap(200, 200)
        Using g As Graphics = Graphics.FromImage(b)
            g.DrawImage(Image.FromFile("F:\projekty\VisualBasic projekty\qwe\Sprite1Colored.PNG"), 0, 0)
        End Using
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        PictureBox1.Image = System.Drawing.Image.FromFile("F:\projekty\VisualBasic projekty\qwe\Sprite1Colored.PNG")
    End Sub
End Class

Ospravedlňte prosím moje chabé znalosti, ale ja som škola starého ZiLog80 a len príležitostne VB6...tu som čerstvý začiatočník :-)

P.S. kód nedefinuje, kde sa má obrázok zobraziť. Snáď na Formulár ?

Ako "poviem" aby sa vykreslil do Picture XY ?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nechápu, co váš kód má dělat. Pokud má po kliknutí načíst do PictureBoxu obrázek, tak tam vůbec nemusíte mít to proceduru Form_Load, ta jenom vytvoří v paměti bitmapu o velikosti 200x200, něco do ní nakreslí, a pak ji zahodí, proměnná b se nikde dál nepoužije.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

nie, nie, Klik je tam ako som písal, iba pre kontrolu správnosti adresy (to mi totiž funguje).

Ja potebujem, aby fungoval aj ten prvý kód.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Snažíte se použít kód, kterému asi nerozumíte a rad nedbáte. Bylo by pro vás užitečné, pokud byste zde nejprve nastudoval základy práce s grafikou. Co jste napsal v úvodu lze realizovat a úloha není až tak obtížná, ale bez znalosti základů ji nesestavíte.

Jestli chcete v aplikaci manipulovat s obrázky, pak je to možné jak přímo ve formuláři anebo v PictureBoxu (boxech). Na ploše formuláře či PictureBoxu (asi s velkým obrázkem, že?) chcete manipulovat s dalšími obrázky s průhledným pozadím. Pak nehledejte průhlednost v PictureBox, ale nadefinujte si a načtěte obrázky s průhledným pozadím do objektů Image a ty pak je v Paint (buď tedy formuláře nebo PictureBoxu) vykreslujte. Třeba v událostech myši nebo pomocí nabídky či tlačítek můžete měnit pomocí promšnných typu Point souřadnice umístění obrázků a pomocí hodnot logických proměnných měnit, zda se který obrázek má nebo nemá vykreslit. Základní obrázek můžete vložit na pozadí Form či PictureBox jednoduše již v návrhu nebo v kódu anebo načítat pomocí dialogů.

Opravte mě, pokud sledujete jiný cíl.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Bylo by pro vás užitečné, pokud byste zde nejprve nastudoval základy práce s grafikou.

Mimo iných zdrojov, som sa odhodlal využiť práve toto fórum, ako "interaktívný tutoriál" (odpovie a poradí, kto má práve čas a chuť)

Zdá sa mi to ako dobrá možnosť.

Potreboval som krátku rutinu, ktorá vykreslí obrázok transparente, pretože PictureBox.Image = bla, bla, bla... nič transparentné nevytvoril a nič iné ma v súvislosti s grafikou nenapadlo(visual basic.NET krok za krokom má viac ako 650 strán, ale zmienka o transparentom vykreslovaní tam nieje)

Tu mi bolo predložené riešenie, ktoré som použil tak ako bolo napísané, ale formulár zostal po spustení prázdny (k nejakej transparentnosti som sa ani nedostal).

Tudiž ako začiatočník, som urobil iste triviálnu chybu, ale ja netuším kde. Prípadne som mal do kódu doplniť niečo čo vy skúsení považujete za samozrejmosť. Fakt neviem.

Preto skúsim zadanie ešte raz...

- Chcem vykresliť obrázok na Formulár (PictureBox) takou metódou, že konkrétna jeho farba bude transparentná voči pozadiu.

Či transparentnosť farby obslúži rutina, alebo si tam nahrám transparentné .PNG, je mi jedno.

Ďakujem...

P.S: Som účastníkom fora 3DS MAX na grafika-online už veeelmi dlho, ale "sme" akosi menej oficiálni. Človek sa až bojí, že obťažuje, alebo použije nesprávny termín :-)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

...aby sa nezdalo, že zúfalo a nečinne čakám,kto mi nasype info do hlavy, naučil som sa použiť

e.Graphics.DrawImage(ImageList1.Images(0), 20, 200)

v ImageListe sa dá nastaviť vlasnosť TransparentColor, takže moj problém to, zdá sa, rieši.

Grafika je ale limitovaná rozmermi (256x256), takže predošlý dotaz stále platí :-)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

"Mimo iných zdrojov, som sa odhodlal využiť práve toto fórum, ako "interaktívný tutoriál" (odpovie a poradí, kto má práve čas a chuť)

Zdá sa mi to ako dobrá možnosť."

Zašel jste na správné místo!

"Potreboval som krátku rutinu, ktorá vykreslí obrázok transparente, pretože PictureBox.Image = bla, bla, bla... "

Odpověď tu je:

1. Průhlednost: "Připojuji se, pokud vykreslíte normální metodou obrázek, který má zakomponovanou průhlednost PNG, GIF....(Datum: 25.3.2009 21:25 Autor: Petr Mánek)"

To je ten nejjednodušší způsob. Máte obrázek s průhledným pozadím a ten použijete. Vytvářet průhlednost a aplikaci je složitější

2. Zobrazení obrázku: Stačí načíst do PictureBox, to máte:

  Private Sub Button1_Click(ByVal sender As System.Object, _
      ByVal e As System.EventArgs) Handles Button1.Click
    PictureBox1.Image = _
      System.Drawing.Image.FromFile("F:\projekty\VisualBasicprojekty\qwe\Sprite1Colored.PNG")
  End Sub

Ta část kódu, kterou považujete za hlavní a nefunkční, funkční je, ale je ke zobrazení obrázku ze souboru zbytečná, jak vám napsal p. Herceg.

Že práce tohoto kódu není vidět je tím, že se odehraje pouze v paměti: "Form_Load, ta jenom vytvoří v paměti bitmapu o velikosti 200x200, něco do ní nakreslí, a pak ji zahodí, proměnná b se nikde dál nepoužije Datum: 26.3.2009 7:45 Autor: Tomáš Herceg"

Proměnná b je obrázek. Pokud jej chcete zobrazit, přidejte za jeho vytvoření:

    PictureBox1.Image = b

Jestli něco z uvedeného nefunguje, pak by chyba mohla být v samotném souboru obrázku nebo v jeho adrese

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ďakujem,

ten posledný riadok to ucelil :-)

Teraz to už funguje...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jsem rád, že jste zde získal potřebné - tomuto serveru fandím!

Kdybyste řešil další problém, zeptejte se raději v nově založeném tématu s výstižným názvem. Téma "transparentný picture" není to pravé, protože si myslím, že přes transparetntní PictureBox pro v úvodu zmíněný cíl, tj. kompozici, cesta nevede.

Toto vlákno by bylo dobré ukončit.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

No, možná mají na fóru 3DS Max trochu jiné zvyklosti, ale my tady obecně neradi radíme stylem někdo se na něco zeptá a dostane kompletní kód, jak to udělat. Náš server je zaměřen spíš na ty, kteří se chtějí něco naučit, tak se jim snažíme vysvětlit, jak to funguje, a jenom je nasměrovat na správnou cestu. Na druhou stranu předpokládáme, že si tazatel přečte pár článků, které tady máme, protože abychom stokrát opisovali do fóra to, co tady máme v článcích, je k ničemu. Plácat k sobě kusy kódu, které posháníte tu a tamhle, je k ničemu, důležité je kódu porozumět a vědět, co dělá.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nechcel som celý program, ale ten posledný riadok mi chýbal do jednej ucelenej malej fugujúcej "myšlienky". Teraz s ňou viem eperimentovať a naučiť sa ju chápať.

Mrzí ma, že nie som taký chytrý. Tí chytrejší v logike by mohli mať teda štepku empatie a chápať, že každý má inú metodiku pre osbný pokrok ;-)

...a ešte raz ďakujem

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback