Konverze objektu Image na Icon   zodpovězená otázka

VB.NET, Grafika

Dobrý den!

Marně si lámu hlavu nad takovým malým prográmkem. Má aplikace běží na pozadí, má svou ikonu v Systray. Během svého života sleduje nějakou "věc". Pokud zjistí, že "věc" změnila svůj stav, tak zobrazí info-bublinu a (a teď příjde ten můj problém) rád bych, aby změnila ikonu podle aktuálně zjištěného stavu. Obrázky ikon mám uložené v oobjektu ImageList. Problém mám v tom, že vlastnost Icon objektu NotifyIcon je opravdu objekt Icon a nechce mi to brát obrázky uložené v objektu ImageList, což je pochopitelné, protože ty zde jsou uložené jako objekty Image. Jde mi o to, zda lze nějakým způsobem konvertovat objekt Image do objektu Icon. Zpětně to jde: objekt Icon má operaci ToImage.

Zatím jsem přišel jen na to, že..

1. .. bych mohl obrázek uložit jako soubor na disk (Image.SaveAs) a pak jej načíst do objektu Icon

2. .. bych mohl mít několik objektů NotifyIcon (každý jinou ikonou), u kterých bych ovládal jejich viditelnost v Systray.

Osobně s č. 2 nesouhlasím, a č. 1 mi připadá těžkopádná.

Díky za radu.

===============================================Visual Studio 2005,Visual Studio 2008

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

Dobrý den,

tak si přeuložte obrázky do formátu ico (kód například zde http://www.freevbcode.com/ShowCode.asp?I... ) a pak je načtěte do nějaké kolekce. ImageList na ikony fungovat nebude.

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

Díky za podnět. Vytvořil jsem si tedy funkci, která má na vstupu objekt Image a měla by vracet objekt Icon. Převod provádím tak, že se obrázek objektu Image uloží do dočasného adresáře jako nový soubor ve formátu ikony, a ten se pak načte do objektu Icon, který pak funkce vrací. Toliko teorie.

Zde je můj návrh kódu:

Private Function GetIconFormImage(ByVal img As Image) As Icon
     Dim tmpName As String
     Dim OutFormat As ImageFormat = ImageFormat.Icon
'====================================================
     'Získání jména dočasného souboru
      tmpName = GetTempPath() & _ 
      GetFileNameWithoutExtension(GetTempFileName)
      'Přiřazení přípony
      tmpName &= "." & OutFormat.ToString
      'Uložení suboru ve zvoleném formátu
      img.Save(tmpName, OutFormat)
      'Návratová hodnota
      Return New Icon(tmpName)
      'Smazání dočasného souboru
      System.IO.File.Delete(tmpName)
End Function

Programu se zastaví na kroku, kdy se má provést načtení do objektu nové ikony s vyjímkou, že obrázek nelze použít jako ikonu (Argument 'picture' must be a picture that can be used as a Icon.). Když jsem se podíval do dočasné složky, našel ten dočasný soubor s příponou Icon a zobrazil jej v prohlížeči v textovém modu, zjistil jsem, že je to ve skutečnosti jen soubor ve formátu PNG a příponou Icon. Žádná ikona.

Zřejmě to není s konverzí bmp => ico tak jednoduché, neboť u ikony se například definuje i průhledná barva, že?

Zřejmě svůj ikonový problém vyřeším načtením objektů ikon z opravdových souborů ikon hned při spuštění aplikace do pole.

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

Předpokládejme, že máme komponentu NotifyIcon1 a v ní načtenou nějakou výchozí ikonu.

Dim picture As Bitmap = NotifyIcon1.Icon.ToBitmap()
Dim gfx As Graphics = Graphics.FromImage(picture)
gfx.DrawRectangle(Pens.Black, 0, 0, 16, 16)
gfx.DrawString("abc", Me.Font, Brushes.Black, 0, 0)
NotifyIcon1.Icon = Icon.FromHandle(picture.GetHicon())

Příklad nakreslí text "abc" do černého obdélníku přímo do ikony v Oznamovací oblasti (komponenta NotifyIcon).

Úpravou tohoto jednoduchého kódu lze na ikonu kreslit libovolně, například průběh něčeho v procentech nebo jednoduchý graf a údaje pravidelně aktualizovat pomocí komponenty System.Timer.

Není tudíž problém do ikony nakreslit i obrázek v libovolném podporovaném formátu (bmp/jpg/png) pomocí metody Graphics.DrawImage.

Myslím že toto je naprosto čistý postup bez zbytečných mezikonverzí...

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