WPF transparentní bitmapa   zodpovězená otázka

VB.NET, WPF, Silverlight

Dobrý den,

chtěl bych se zeptat jak vytvořit bitmapu ve WPF.

Potřebuji, aby obsahovala alpha kanál. Ve winforms to bylo cekem jednoduché. Tady mám problém.

Př.:

        Dim rows As Integer = 200
        Dim cols As Integer = 200

        Dim pxFormat As PixelFormat = PixelFormats.Bgra32
         Dim stride As Integer = (cols * pxFormat.BitsPerPixel + 7) / 8
        Dim arPixel(rows, cols) As Integer
        Dim transparentPixel As Integer = &HFFFFFFFF
        

        For x As Integer = 0 To cols
            For y As Integer = 0 To rows
                arPixel(x, y) = transparentPixel
            Next
        Next

        Dim b As BitmapImage = BitmapImage.Create(cols, rows, 96, 96, pxFormat, _
                                                      Nothing, arPixel, stride)

        Dim stream As New FileStream("d:\new.jpg", FileMode.Create)
        Dim enc As New JpegBitmapEncoder()
        enc.Frames.Add(BitmapFrame.Create(b))
        enc.Save(stream)

chyba se vyvolá na BitmapImage.create.

Vstupní sestava není správná, parametr Pixels.

(Pixels je pole pixelů v př.: arPixels)

Asi je špatný rozměr pole, nebo stride.

Věděl by někdo kde je chyba ?

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

A nebylo by vhodnější použít metodu BeginInit,místo Create?

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

BeginInit a EndInit se používá (pokud jsem to pochopil), když už BitmapImage již obsahuje obrázek a já ho potřebuji nějak transformovat.

Dynamické vytvoření obrázku je podle dokumentace možné pomocí Create.

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

A nemělo by náhodou být místo BitMapImage,BitMapSource? Viz ..MSDN

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

To je jedno, BitMapImage se dědí od BitMapSource.

A ani s BitMapSource to nechodí.

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

Zkoušel jsem to teď ve VS2010 podle tohoto http://msdn.microsoft.com/en-us/library/... "návodu" a vše mi funguje

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

Ano to funguje,

jenže já nepotřebuji formát Indexed1 jelikož ten nemá průhlednost (alpha kanál), a když ho změním na Bgra32, který ho má. Tak se asi musí (dle dokumentace) změnit stride a tudíž i velikost pole pixels. Jenže se mi nedaří příjít na to jak.

Indexed1 má 1 Bit na pixel

Bgra32 má 32 Bitů na pixel

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

V tom je problém...musí se rozšířit pole o byty pro další barvy

Viz.například tento příklad:http://wpftutorial.net/Images.html

slouží opravdu jako příklad,nejde o stejné řešení jako u Vás.Nicméně si myslím,že by Vás mělo nakopnout správným směrem ;-)

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

Tak zkusil jsem to ještě jednou a v dokumentaci se říká, že stride je počet bytů pixel dat na jeden řádek.

Takže jsem dal:

Dim Stride as integer = Width * PixelFormats.Bgra32.BitsPerPixel

a pole jsem dimenzoval na Výšku * stride

Dim arPixels(Height * stride) As Integer

každému prvku v poly jsem nastavil hodnotu barvy na &H00FFFFFF (černá plně průhledná)

A teď to funguje správně.

BitmapImage.Create(Width, Height, 96, 96, _

pixelFormat, Nothing, arPixels, stride)

Jen nechápu, proč se v dokumentaci a v různých examplech počítá stride pokaždé jinak.

Nicméně děkuji za pomoc.

nahlásit spamnahlásit spam 3 / 3 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