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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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

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