{{htmlmetatags>metatag-robots=() metatag-title=(Colorare una bitmap in midres) metatag-keywords=(Colore,Midres,Bitmaps,Commodore 64,Commodore VIC20,Commodore 16) metatag-description=(Una spiegazione su come si colora una bitmap midres.) metatag-media-og:image=(image06cpic.png) metatag-og:title=(Colorare una bitmap in midres) metatag-og:description=(Una spiegazione su come si colora una bitmap midres.) }} ====== COLORARE UNA BITMAP IN MIDRES ====== ===== IL CONCETTO DI "PALETTE" ===== Il modo più diffuso di colorare una immagine è descrivere il colore per ogni pixel, e di solito lo si fa usando il formato RGB a 8 bit per componente. Questo significa usare un byte per descrivere il livello di luminanza in ciascuno dei canali RGB, per un totale di tre byte per pixel. La "palette" è una tabella di corrispondenza, in cui ai colori selezionati dalla gamma dei possibili colori (così come descritti secondo la logica RGB) viene assegnato un indice, in base al quale è possibile fare riferimento a livello di pixel. Usare un indice richiede meno spazio, ed è una tecnica che mira a ridurre l'utilizzo della memoria, il carico di elaborazione, la larghezza di banda, nonché l'utilizzo della RAM o delle memorie di massa. Nei retrocomputer è di solito presente una palette fissa, composta da un insieme limitato e preprogrammato di colori. Questo implica che la rappresentazione dei colori originali avviene "adattando" il colore, ovvero selezionandone uno vicino. Nel Commodore 64, ad esempio, la palette è costituita da 16 colori mentre nel Commodore VIC 20 la palette è limitata a soli 8 colori. ===== MAPPARE I COLORI ====== Come abbiamo descritto nell'[[midres bitmap|altro argomento]], le bitmap "midres" sono composte da mixel in bianco e nero, dove il valore 1 indica il bianco e il valore 0 indica il nero. Siccome la "midres" usa la modalità testo, che prevede di poter definire un colore diverso scelto da una palette per ogni carattere, i mixel possono essere colorati a gruppi di 2x2. {{ ::midres2_color.png?nolink&600 |}} In questa figura, ad esempio, assistiamo alla colorazione di 16 mixels. I mixel accesi nella riga 0 sono rossi. Così sono anche i mixel nella posizione ''(0,1)'' e ''(3,1)''. I mixel nella riga 2, invece, sono blu. Da notare come i mixel restanti siano spenti e siano quindi di colore nero, ma siano rappresentati sul diagramma con un colore più tenue. Questo serve per sottolineare come, se venissero accesi, assumerebbero il colore relativo al carattere di appartenenza. Questo implica che la colorazione delle immagini è imprecisa, e subisce un fenomeno chiamato "color clash". ===== COLORARE UN MIXEL ===== Colorare un mixel è un processo meno preciso di quello del disegno, e questo a causa del fatto che il colore di un mixel dipende dal colore del carattere al quale il mixel appartiene. Si comincia individuando le coordinate del carattere sullo schermo a cui afferisce il mixel che si vuole disegnare alle coordinate ''(x,y)''. Supponendo di operare con un carattere da 8x8 pixel e con una matrice da 2x2 mixel per carattere, il carattere si ottiene dividendo le coordinate per 2: mx = _x >> 1; my = _y >> 1; A questo punto, per colorare il mixel è sufficiente sostituire il colore di quello specifico carattere. _screen[my * WIDTH + mx] = _color + BRIGHTNESS; \adsense\ ===== EXAMPLE ===== Si prenda, ad esempio, la seguente immagine PNG (800x500 pixel, 24 bpp): {{ ::image06.png?nolink&600 |}} Si può utilizzare il programma [[https://github.com/spotlessmind1975/img2midres|img2midres]] per convertire tale immagine in due file (''-o'', ''-O'') direttamente caricabili in memoria (''-u'') con una bitmap indicizzata midres per il Commodore 64 (''-64''): img2midres64.exe -64 -u -i image06.png -o image6406c.pic -O image6406c.col Una volta inseriti i due file in un disco, sarà possibile scrivere un breve programma BASIC: 10 if p=0 then 50 20 if c=0 then 60 30 poke 53281,0 40 goto 40 50 p=1:load "image6406c.pic",8,1 60 c=1:load "image6406c.col",8,1 Questo è il risultato che si ottiene: {{ ::image06cpic.png?nolink&600 |}} Se invece si possiede un Commodore VIC 20, si può utilizzare il programma [[https://github.com/spotlessmind1975/img2midres|img2midres]] per convertire tale immagine in due file (''-o'', ''-O'') direttamente caricabili in memoria (''-u'') con una bitmap midres indicizzata per il Commodore VIC 20 (''-20''): img2midres64.exe -20 -u -i image06.png -o image2006c.pic -O image2006c.col Una volta inseriti i due file in un disco, sarà possibile scrivere un breve programma BASIC: 5 if i=0 then 45 10 if p=0 then 50 20 if c=0 then 60 30 poke 36879,8 40 goto 40 45 for i=0 to 23*22:print " ";:next i 50 p=1:load "image2006c.pic",8,1 60 c=1:load "image2006c.col",8,1 Questo è il risultato che si ottiene: {{ ::image2006cpic.png?nolink&600 |}} ===== COLOR CLASH ===== Il "color clash" è, in generale, un fenomeno causato dai limiti nei circuiti grafici di alcuni retrocomputer, dove vi è la limitazione di due colori per ogni carattere che compone l'insieme di mixel considerato. Tale limite nasce dal particolare layout della memoria dei processori video che supportano la modalità testo, progettata in modo tale da ridurre al minimo l'uso della memoria del frame buffer e ottimizzare, così, la visualizzazione del testo anziché della grafica. Per risparmiare memoria, la bitmap e la mappa colore sono memorizzate in aree separate della memoria. Mentre la bitmap specifica lo stato dei singoli mixel (attivato o disattivato), le informazioni sul colore (o "attributi") corrispondono sempre e soltanto alla matrice dei caratteri del testo. Questo byte codifica, in modi diversi da piattaforma a piattaforma, l'indice nella palette da utilizzare. Pertanto, ogni blocco può contenere solo 2 colori tra quelli disponibili. Il tentativo di aggiungere un terzo colore nella medesima area sovrascrivere il colore precedente. {{ ::midres2_clash.png?nolink&600 |}} Ad esempio, se si ha una immagine con quattro pixel aventi tre colori diversi, i mixels correlati avranno solo uno dei tre colori. Ne consegue che **una grafica a colori finemente dettagliata è impossibile**, poiché il colore può essere applicato solo ai caratteri che compongono i mixel. Per evitare questo tipo di conflitto, **le visualizzazioni grafiche statiche vanno costruite con cura**.