PDA

Visualizza la versione completa : [C++] Si può editare un testo su un'immagine?


Maurix1969
17-07-2008, 18:19
Gentili Amici,

programmando in C++ vorrei sovrapporre un testo, casomai con un Font particolare, su un'immagine bitmap gestita con le funzioni di FreeImage (che non prevede elaborazioni di grafica testuale).

Mi sapreste dare suggerimenti su come fare? Ci sono delle librerie a riguardo? Esistono delle API Windows?

Non ho proprio esperienza in merito.

Vi ringrazio molto per l'aiuto che vorrete darmi.

Maurizio

menphisx
17-07-2008, 18:34
Originariamente inviato da Maurix1969
Gentili Amici,

programmando in C++ vorrei sovrapporre un testo, casomai con un Font particolare, su un'immagine bitmap gestita con le funzioni di FreeImage (che non prevede elaborazioni di grafica testuale).

Mi sapreste dare suggerimenti su come fare? Ci sono delle librerie a riguardo? Esistono delle API Windows?

Non ho proprio esperienza in merito.

Vi ringrazio molto per l'aiuto che vorrete darmi.

Maurizio

È semplicissimo, in teoria.
Crei un'immagine in cui metti le lettere, ogni lettera corrisponde a tot pixel; ad esempio una lettera corrisponde a 30px.
Poi fai cosi:


function drawText(string input, int x, int y) {

for i to len(input) {

offset = (input[i] - 'a') * 30;
//disegna sull'immagine i pixel contenuti da offset fino a offset + 30 alla posizione (x + i * 30, y)

}

}


Ovviamente devi rispettare la trasparenza o settando il canale alpha oppurtunamente, oppure disegnando solo i pixel neri.

Maurix1969
17-07-2008, 18:53
menphisx,

grazie dell'aiuto ma leggendo il tuo codice non capisco come inserire i singoli caratteri della stringa, ad esempio una "M" (eventualmente con un particolare font, la grandezza giusta... ) nell'area di memoria che nel ciclo dovrà essere sovrapposta all'immagine. I caratteri mica me li devo disegnare pixel a pixel?!

Mi puoi dettagliare meglio? Per il resto il codice è chiaro.

Grazie,

Maurizio

oregon
17-07-2008, 19:19
Ma perche' non usi le funzionalita' delle normali API GDI di Windows?

Per visualizzare un testo c'e' la API DrawText
http://msdn.microsoft.com/en-us/library/ms533909(VS.85).aspx

Non so come funzionano le librerie che usi, ma penso proprio che potrai usare questa API ...

Maurix1969
17-07-2008, 19:39
Oregon,

grazie del suggerimento. Non ho mai utilizzato le API Windows ma è la volta buona che inizio a provarle.

In effetti cercavo una funzione di libreria come quella chi mi hai segnalato.

Ora mi tocca capire come utilizzare la funzione e come integrarla al mio programma.

Grazie molto,

Maurizio

menphisx
18-07-2008, 15:56
Originariamente inviato da Maurix1969
menphisx,

grazie dell'aiuto ma leggendo il tuo codice non capisco come inserire i singoli caratteri della stringa, ad esempio una "M" (eventualmente con un particolare font, la grandezza giusta... ) nell'area di memoria che nel ciclo dovrà essere sovrapposta all'immagine. I caratteri mica me li devo disegnare pixel a pixel?!b

Mi puoi dettagliare meglio? Per il resto il codice è chiaro.

Grazie,

Maurizio

Si l'idea era quella.
Per diseganre la 'M' alla posizione (x, y):
Calcoli l'offset nel file file delle lettere. La 'M' è la 13 lettera, quindi si trovera a 13*30 px dall'inizio dell'immagine (se le singole lettere sono grandi 30 px in larghezza).
Quindi prendi i pixel dal 13*30 px al 13*30 + 30 px in larghezza. L'altezza non è importante.
Poi setti i valori dei pixel nell'immagine in qui vuoi inserire il testo, alla posizione (x, y), agli stessi valori dei pixel della lettera; rispettando la trasparenza (cioè disegni solo i pixel che hanno un colore, non quelli bianchi o nulli).
L'idea era questa, semplice.
Poi nessuno ti vieta di utilizzare le API Windows.

:ciauz:

Maurix1969
19-07-2008, 02:33
Menphisx

ancora non ho capito come riempire le singole aree di 30 bytes con i pixel originali dei font che vorrei. Tutto quello che dici mi è chiaro ma credo che tu non abbia inteso quello che ti chiedevo.

In pratica, se voglio scrivere la parola "Mauri" nel font Arial sull'immagine, da dove copio i pixel che costituiscono la "M"? e poi la "a"? e così di seguito in Arial? Ho capito che devo riempire i pixel in una porzione di memoria per poi distribuirli a video. E questo lo saprei fare, ma da dove leggo (pixel per pixel) la forma del singolo carattere? Tutti i suoi pixel?

Mica pixel per pixel mi devo costruire la MATRICE di tutte le lettere dell'alfabeto (o quantomeno della frase che voglio scrivere), in un particolare stile pieno, nella dimensione che mi serve?

Al massimo, ridisegnando manualmente la matrice dei caratteri, si riuscirebbe a generare una scritta in uno stile molto rozzo e stilizzato e si avrebbe poi il problema del ridimensionamento e del consecutivo riempimento del carattere.

Come vedi, non ho capito. Se invece si tratta di riscrivere i font, allora questa soluzione non è adatta al mio scopo.

Aspetto un tuo commento.

Grazie mille!

Maurizio

oregon
19-07-2008, 09:51
Ma non hai piu' provato ad utilizzare le API?

Maurix1969
19-07-2008, 11:39
Ciao Oregon,

Il fatto è che stavo studiando i parametri della funzione API DrawText (da te suggerita) che non mi risultano immediati per il fatto, tra l'altro, che dovrei lavorare su un Bitmap dichiarato FIBITMAP *bitmap (in FreeImage).

Tu hai qualche idea su come far puntare la funzione al mio Bitmap?

Forse una soluzione (un pò macchinosa) sarebbe quella di salvare la mia Bitmap (su cui sto lavorando con FreeImage) e ricaricarla con una funzione API di Windows (ma quale?)

Hai qualche idea o esempi in merito?

Ti ringrazio molto e saluto.

Maurizio

oregon
19-07-2008, 12:48
Ma tu la bitmap la deve visualizzare con il testo? O la devi modificare e salvare?

Loading