Průhlednost v MDX   zodpovězená otázka

VB.NET, DirectX

Velice mne zaujal soubor článků Tomáše Hercega o DirectX. Snažil jsem se vyhledat i další zdroje informací, leč narazil jsem na problém. Současné MDX je zaměřené především na 3D grafiku, čemuž jsou přizpůsobeny snad i všechny "tutoriály", ba i dokonce dokumentace dodávaná k SDK nebo se nalézající na MSDN. Problém je hlavně v tom, že jediná podporovaná knihovna dnes je DirectX3D, která by se měla využívat i pro 2D grafiku (ale ke konkrétní aplikaci v této oblasti jsem na netu nic moc nenašel) (a krom toho mi připadá použití této knihovny pro mé účely jednoduché 2D animace jako jít kanónem na vrabce) a knihovna, která by zřejmě mým potřebám (a snad i schopnostem) vyhovovala, tedy DirectDraw již není doporučována pro použití, což s sebou nese jeden velice nepříjemný aspekt, že ani v oficiální dokumentaci k DirectX SDK, ani třeba v rámci ObjectBrowseru se již člověk nedočte nic konkrétního o způsobech a možnostech použití té které funkce. Pouze dlouhé povídání, že už by se neměla používat a pak na konci jediná věta, k čemu funkce slouží (což je ve stejném rozsahu většinou patrné již z názvu).

Díky seriálu Tomáše Hercega je celkem snadné využívat knihovnu DirectDraw k tomu základnímu - vykreslení, resp. rozpohybování 2D scény, jen jsem marně pátrel, jakou cestou (přes jakou třídu či funkci) se dostat k jednoduché průhlednosti vykreslovaných obrázků (nejedná se o maskování, jako bylo uvedeno v příkladě, tj. zprůhlednění jedné barvy v obrázku, jde mi smíše o něco jako jednoduchá prolínačka mezi dvěma obrázky (ve filmařině tzv. cross-fade). Můžete mne někdo nakopnout, s čím bych mohl zkusit laborovat, nebo, ještě lépe, nevíte někdo o zdroji, ze kterého by se dala stáhnout plnohodnotná dokumentace DirectDraw (tedy v rozsahu, v jakém jsou popsány odstatní dnes podporované funkce?

Dík předem za pomoc.

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

Pokud by šlo o prolínání bitmap, které jsem jako ukázku dal na:

http://issau.slany.indos.cz/prolinacka.h...

a máte zájem o celý kód, tak ho vložím.

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

Dík za reakci. Ano, funkčně se jedná o požadovaný princip a zajímalo by mne, je-li to možné, jak to máte řešeno - využíváte MDX, kam byl původně můj dotaz směřován, nebo jedete přes GDI+. Není-li to moc velké, na kód bych se rád kouknul, protože se stále učím. Osobně potřebuji pro nějaké své speciální aktivity něco naprogramovat a část tvoří právě trochu specializovaná photoslide-show. No a vzhledem k tomu, že to pojede ve fullscreenu (ač při menším rozlišení), zahrával jsem si s myšlenkou, nezapojit-li do toho právě z důvodu výkonnosti to MDX. Leč jako (ne)programátor-začátečník jsem dojel na problém, že knihovna (directDraw), o které tady byl velice zajímavý a hlavně pochopitelný článek již není od MS podporována- tedy technicky jede a ještě dlouho asi pojede, ale ač jsem se snažil sebevíc, nenalezl jsem k ní žádnou použitelnou dokumentaci, takže jsem se nedostal dále. No a Direct3D, která by se měla dnes používat, je zatím nad rámec mého skrovného chápání. Tak jsem se tedy vrhnul do řešení problému přes GDI+, zatím to vypadá, že by to výkonově mohlo stačit, ael jakákoliv inspirace je pro mne i do budoucna zajímavou.

Dík za Vaši ochotu, a bude-li možné ton kód...

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

Tak tu je celý program. Na formuláři je nabídka. Volbou Akce proběhne prolínání obrázků z Resource, nebo se dají obrázky načíst ze souborů.

Dále je na formuláři PictureBox, do kterého se vykresluje a HScrollBar, kterým lze prolínání ovládat ručně. Formulář i PictureBox mají AutoSize.

No, s výkonem nevím, tak na malé obrázky anebo našlapaném počítači.

Imports System.Drawing.Imaging

Public Class Form1
  Dim soub1 As String = ""
  Dim soub2 As String = ""
  Dim stuj As Boolean

  Public Sub Prolinacka(ByVal pozice As Double)
    Dim obr1 As Image
    Dim obr2 As Image
    If soub1 <> "" And soub2 <> "" Then
      obr1 = Image.FromFile(soub1)
      obr2 = Image.FromFile(soub2)
    Else
      obr1 = My.Resources.scena2
      obr2 = My.Resources.scena1
    End If
    Dim obr = New Bitmap(obr1.Width, obr1.Height)
    Dim gr As Graphics = Graphics.FromImage(obr)
    Dim rect As Rectangle = Rectangle.Round(obr1.GetBounds(GraphicsUnit.Pixel))
    Dim imgAttr As New ImageAttributes
    Dim cM As Imaging.ColorMatrix
    Dim mA As Double = 0
    mA = pozice / 1000
    cM = New ColorMatrix(New Single()() { _
        New Single() {1.0, 0.0, 0.0, 0.0, 0.0}, _
        New Single() {0.0, 1.0, 0.0, 0.0, 0.0}, _
        New Single() {0.0, 0.0, 1.0, 0.0, 0.0}, _
        New Single() {0.0, 0.0, 0.0, 0.0, 0.0}, _
        New Single() {0.0, 0.0, 0.0, mA, 1.0}})
    imgAttr.SetColorMatrix(cM)
    gr.DrawImage(obr1, rect, 0, 0, obr1.Width, obr1.Height, GraphicsUnit.Pixel, imgAttr)
    cM = New ColorMatrix(New Single()() { _
        New Single() {1.0, 0.0, 0.0, 0.0, 0.0}, _
        New Single() {0.0, 1.0, 0.0, 0.0, 0.0}, _
        New Single() {0.0, 0.0, 1.0, 0.0, 0.0}, _
        New Single() {0.0, 0.0, 0.0, 0.0, 0.0}, _
        New Single() {0.0, 0.0, 0.0, 1 - mA, 1.0}})
    imgAttr.SetColorMatrix(cM)
    gr.DrawImage(obr2, rect, 0, 0, obr2.Width, obr2.Height, GraphicsUnit.Pixel, imgAttr)
    PictureBox1.Image = obr
    PictureBox1.Refresh()

  End Sub
  Private Sub HScrollBar1_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs) Handles HScrollBar1.Scroll
    stuj = True
    Dim hdn As Integer = HScrollBar1.Value
    Me.Text = hdn
    Prolinacka(hdn)
  End Sub

  Private Sub KonecToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles KonecToolStripMenuItem.Click
    Me.Close()
    End
  End Sub

  Private Sub AutomatToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AutomatToolStripMenuItem.Click
    If AutomatToolStripMenuItem.Text = "Stop" Then
      stuj = True
    Else
      AutomatToolStripMenuItem.Text = "Stop"
      stuj = False
      HScrollBar1.Value = 0
    End If
    For i As Double = 0 To 1000 Step 10
      Me.Text = i
      HScrollBar1.Value = i
      Prolinacka(i)
      'System.Threading.Thread.Sleep(100)
      Application.DoEvents()
      If stuj Then
        AutomatToolStripMenuItem.Text = "Akce"
        Exit For
      End If
    Next
    AutomatToolStripMenuItem.Text = "Akce"
  End Sub

  Private Sub NačtiObr1ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NačtiObr1ToolStripMenuItem.Click
    NactiObr(1)
  End Sub

  Private Sub NačtiObr2ToolStripMenuItem_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NačtiObr2ToolStripMenuItem.Click
    NactiObr(2)
    Me.Height = 200
    Me.Width = 300
    PictureBox1.Height = 80
    PictureBox1.Width = 100
  End Sub

  Private Sub NactiObr(ByVal i As Integer)
    stuj = True
    OpenFileDialog1.FileName = ""
    OpenFileDialog1.Filter = "Obrazové soubory|*.bmp;*.jpg;*.jpeg;*.gif|Bitmap Files" & _
        "*.bmp)|*.bmp|GIF (*.gif)|*.gif|JPEG (*.jpg)|*.jpg;*.jpeg|Všechny soubory|*.*"
    If OpenFileDialog1.ShowDialog() <> DialogResult.OK Then
      soub1 = "" : soub2 = ""
      PictureBox1.Image = Nothing
      Exit Sub
    End If
    Me.Height = 200
    Me.Width = 300
    PictureBox1.Height = 80
    PictureBox1.Width = 100
    Me.Text = OpenFileDialog1.FileName
    Try
      PictureBox1.Image = Image.FromFile(OpenFileDialog1.FileName)
      If i = 1 Then
        soub1 = OpenFileDialog1.FileName
      Else
        soub2 = OpenFileDialog1.FileName
      End If
    Catch ex As Exception
      MsgBox(ex.ToString, MsgBoxStyle.Critical, " Chyba při načítání souboru: ")
    End Try
  End Sub

End Class

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

Dík za námět. (doufám, že jste danou utilitku netvořil pouze kvůli mně). Tak touto cestou jsem se nakonec vydal také (za použití colormatrix) a mám to, prozatím, řešeno dost obdobně. No a když jsem se pouštěl do řešení jsem právě bádal nad Vámi zmiňovanou douškou - ohledně výkonu. Zatím stále tvořím a zkouším, ale už i na mé (celkem nadupané)mašině jsou vidět rozdíly - jak jsem psal, jedu to ve fullscreenu a navíc mám možnost to posílat buď na primární či na sekundární obrazovku. No a ač na sekundáru (1024 x 768) to vypadá celkem plynulé, stačí, když to pošlu na primár (1600 x 1200) a už je dost patrné "zadrhávání". Ve výsledku to sice budu honit na ještě nižší rozlišovačku (800x600), která bude stejně ještě grafikou transformována do PALu (720 x 576), takže nějakou rezervu ještě mám, ale ta mašina zase bude o poznání pomajelší a krom toho nebude toto jediná činnost, kterou bude (současně) vykonávat. Proto jsem pokukoval po Direct-u. Nemáte zkušenosti, jestli i v této oblasti (2D bitmapové grafiky) může MDX přinést nějaké výkonnostní ovoce?

Jinak ale děkuji ještě jednou, alespoň jste mi potvrdil, že se neubírám slepou uličkou.

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