Načtení obrázku .jpg s formátem RGBA   zodpovězená otázka

VB.NET, WinForms

Zdravím všechny přítomné a rád bych se pozeptal na jednu možná triviální záležitost.

Při řešení nějakého problému v této diskusi jsem narazil na drobný problém, a to jak dostat obrázek ze souboru (typu jpg, ale obecně to může být jakýkoliv) do objektu typu Bitmap ale tak, aby tento objekt měl formát včetně alpha složky? (např. Format32bppArgb)? Pokud to normálně načtu, tak se mi z toho stane obyč. formát 24Rgb (Jpg nemá informaci o Alfa kanálu). Dík za nakopnutí - asi to bude jednoduché, ale svou dávku inteligence jsem dnes již v diskusi evidentně vyčerpal :-)

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

Zdravím,

nevím, zda ode mě uslyšíte přesně to co potřebujete, ale pokud použijete formát png, který kanál průhlednosti podporuje, tak načítání není problém.

Například:

Dim btm As Bitmap = Bitmap.FromFile("d:\gfx\pruhlednost.png")

Ukázkový soubor s průhledností:

http://upload.wikimedia.org/wikipedia/co...

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

Děkuji za ochotu, ale já mám problém právě v tom .jpg a právě proto, že on průhlednost nepodporuje. Dostal jsem se k tomu, když jsem tady pro kolegu řešil nějaké filtry na obrázky, a asi nejpoužívanější(obecný) zdroj obrázků je právě to .jpg.

V aplikaci, kterou s pomocí znalostí nabytých na Vašem vebu tvořím, tak problém nemám - pokud načtu jakýkoliv obrázek, tedy i .jpg do bitmapy, můžu na něj aplikovat filtr pomocí transformační matice bez problémů - tam i ta transparentnost funguje.

Jenomže v tom, co náš mladý kolega potřeboval, (různý stupeň transparentnosti v různých místech obrázku) jsem si nebyl schopen pomoci žádnou transformační maticí (natolik to ještě neznám) a jediný způsob, který mne napadl bylo nastavování pixelu po pixelu. No a tady jsem právě narazil na ten problém, kdy bych potřeboval načíst libovolný obrázek (včetně těch jpg-ček) a potom (nebo před tím) bitmapě změnit formát nebo s daným obsahem přetransformovat do formátu včetně Alpha kanálu, abych s ním poté mohl pracovat a nastavovat ho.

Pokud jsem si založil bitmapu s potřebným formátem ARGB a následně do něj načetl jpg-čko, formát se mi (celkem logicky) přemázl zpátky na RGB. V příkladu pro kolegu jsem to nějak obešel (definoval jsem si na založené bitmapě s formátem ARGB prvek "graphics" a do něj obrázek "vykreslil"), ale jsem si vědom toho, že se asi pravou rukou škrábu za levým uchem a že Vy odborníci určetě budete znát nějakou cestu přímější.

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

Prolezl jsem dokumentace funkcí a obávám se, že jiná možnost není. Napsal jsem proto jednoduchou funkci, která načte obrázek v potřebném formátu:

    Function LoadFromFile(ByVal fileName As String, Optional ByVal format As Imaging.PixelFormat = Imaging.PixelFormat.Format32bppArgb) As Bitmap
        Dim btmTemp As Bitmap = New Bitmap(fileName) ' načtení
        If btmTemp.PixelFormat = format Then Return btmTemp ' pokud je soubor již v požadovaném formátu, vrátíme ho
        Dim btm As New Bitmap(btmTemp.Width, btmTemp.Height, format)
        Dim gr As Graphics = Graphics.FromImage(btm)
        gr.DrawImage(btmTemp, New Rectangle(Point.Empty, btm.Size)) ' provedení duplikace
        btmTemp.Dispose() ' vyčištění paměti
        gr.Dispose()
        Return btm
    End Function

Takže jste si vlastně sám odpověděl - nejjednodušší způsob je přes vytvoření druhé bitmapy a zduplikování pomocí GDI+.

Kód je i v kategorii snippety.

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

Děkuji, takže jsme dospěli ke stejnému závěru, čehož si já - začátečník - nesmírně považuji :-)

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