[C] Manipulacija slike in dostop do pixlov v gtk
1GOR
Član
Jaz imam nov problem. Za seminarsko delam nek program, ki bo obdeloval sliko, ter jo prikazal na zaslonu!
Naredil sem GUI v glade 3. V GUI imam widget GtkImage. V image naložim sliko brez problema, sedaj me pa zanima:
1. kako dostopati do pixlov? (get in put)
2. kako prikazati v widget GtkImage dve sliki, s tem da ima vrhnja slika določen transparency(prosojnost)?
1. Vem, da imam na voljo več možnih "formatov": pixbuf, gdk_image, ... Za pixbuf vem, da so problemi če slika ni 8bitna(8bit za posamezen kanal), dostop do pixlov pa naj bi bil takšen: Tako, da me zanima, kaj naj uporabim (pixbuf, gdk_image, ...) in kakšni so dostopi do pixlov?
2. nimam pojma
Že od včeraj googlam vendar rešitve nisem uspel najdi, tako da upam na vašo pomoč!!
Vnaprej hvala za vaše odgovore!
Lp: 1GOR
Naredil sem GUI v glade 3. V GUI imam widget GtkImage. V image naložim sliko brez problema, sedaj me pa zanima:
1. kako dostopati do pixlov? (get in put)
2. kako prikazati v widget GtkImage dve sliki, s tem da ima vrhnja slika določen transparency(prosojnost)?
1. Vem, da imam na voljo več možnih "formatov": pixbuf, gdk_image, ... Za pixbuf vem, da so problemi če slika ni 8bitna(8bit za posamezen kanal), dostop do pixlov pa naj bi bil takšen:
pixel_x_y = (int)gdk_pixbuf_get_pixels(pixbuf)[y*rowstride+(x*3)+color]
2. nimam pojma
Že od včeraj googlam vendar rešitve nisem uspel najdi, tako da upam na vašo pomoč!!
Vnaprej hvala za vaše odgovore!
Lp: 1GOR
Komentarji
gtk_image_get_pixbuf() torej dobiš GdkPixbuf, nato pa klic gdk_pixbuf_get_pixels() vrne guchar *, kjer lahko dostopaš do posameznih pikslov. Funkcija gdk_pixbuf_get_rowstride() vrne število bajtov v eni vrstici slike. Funkcija gdk_pixbuf_get_n_channels() ti vrne število kanalov v enem pikslu.
2.
Alfa kanal je četrti bajt v pikslu, če imaš RGBA pixmap. Torej s piksel[3] lahko določaš prosojnost. Mešanje ene in druge slike pa je samo mešanje ostalih treh (RGB) kanalov.
FYI, GtkImage je gradnik, ki je sposoben na zaslon prikazat sliko. GdkPixbuf pa struktura, ki hrani sliko. GdkPixmap pa je pravtako struktura, ki hrani sliko, vendar je zastarela in se zato priporoča uporaba GdkPixbuf oz. cairo
Pa še en nasvet, mogoče je bolje se izogibat tem guchar tipom. Pri meni je ta tip v resnici bil signed char namesto unsigned char. Namesto guchar torej uporabi unsigned char ali pa uint8_t
Sedaj me pa zanima samo še to, kako naj narišem črto v pixbuf.
v GdkPixbuf naložim sliko, sedaj bi pa rad čez to sliko narisal črto.
Sam sem preučil naslednje:
[list=*]
[*]Funkcija gdk_draw_line nad pixbuf-om ne deluje, ker deluje samo nad naslednikom GdkDrawable.[/*]
[/list]
[list=*]
[*]Sam sem z uporabo cairo knjižnice naredil cairo surface in vse narisal, sliko s črto lahko tudi shranim kot pdf(cairo_surface_write_to_png), ne vem pa kako jo prikažem v GtkImage[/*]
[/list]
Prosim za pomoč pri eni izmed zgornjih možnosti!
Lp:igor
Moja koda zgleda nekako takole:
sedaj bi pa rabil samo funkcjio ki namesto cairo_surface_write_to_png(surface, "a.png") zapiše spremenjeno sliko (narisana črta) v GdkPixbuf ?
Najlepša hvala za odgovore (napsy)!