RISOLTO Python - cImage e gestione immagini

Stato
Discussione chiusa ad ulteriori risposte.

Cotrox

Nuovo Utente
Salve ragazzi, sto cercando di creare un programma (necessariamente basato sull'uso di cImage) che svolga le seguenti funzioni:

Apri Immagine Originale ( e ci sono riuscito )

Trasforma in toni di rosso
Trasforma in toni di verde
Trasforma in toni di blu
Trasforma in Bianco e Nero
Ruota di 90° verso Dx
Ruota di 90° verso Sx

Non voglio che le svolgiate voi al posto mio ahah solo che è da poco che sto iniziando ad usare cImage e non capisco bene come io debba muovermi per ottenere certi risultati...
Sapreste darmi qualche dritta su cosa serva per ottenere l'immagine in tono di ... , in bianco e nero, o una rotazione di essa?

Al momento stavo anche lavorando ad una funzione per ridimensionare l'immagine ma quando la eseguo ridimensiona soltanto la finestra d'esecuzione...

Codice:
def ridimensiona_img():
    old_img = cImage.Image('immagine.gif')
    width = int(input('Inserisci larghezza in pixel: ', ))
    height = int(input('Inserisci altezza in pixel: ', ))
    finestra = cImage.ImageWin('immagine.gif', width, height)
    old_img.draw(finestra)
Post automaticamente unito:

up
 
Ultima modifica:

clessidra

Utente Attivo
429
77
Hardware Utente
CPU
VIA C3
Scheda Video
Ati Rage
Sistema Operativo
linux - Red Hat 1.1
Da quello che ho visto dal progetto su gitlab, l'autore ha anche creato un modulo per trasformare in bianco e nero un'immagine.
Per le rotazioni di 90°, basta una semplice trasformazione di coordinate.
Insomma, bisogna operare sui singoli pixel, dato che quel modulo solo quello ti consente di fare.
Se non sei vincolato a questa libreria, PIL (una interfaccia a ImageMagick) invece è adatto per fare tutto, forse.
 

Cotrox

Nuovo Utente
Mi ero informato un pochino in giro ma purtroppo devo necessariamente utilizzare cImage ... non voglio annoiarvi, mi rendo conto che probabilmente siano cose banali ma sono alle prime armi ahah

Provo ad aggiornarvi sul punto al quale sono arrivato:

Il mio programma fa scegliere tra varie funzioni e al momento sono riuscito a farne funzionare alcune:

- Modifica l'immagine trasformandola in bianco e nero
- Effetto Negativo
- Effetto Filtro Rosso
- Effetto Filtro Verde
- Effetto Filtro Blu
- Apri immagine scegliendola dal PC
- Apri il file immagine originale presente nella cartella
- Ricevi le dimensioni dell'immagine

Ora vorrei provare ad aggiungere le ultime ma sono più complesse...

Ora sto lavorando sul ridimensionare un'immagine ma ho fatto tutto a ragionamento personale e non so se a livello teorico possa funzionare.. fatto sta che sbaglio qualcosa... potreste dargli un'occhiata?

Codice:
def scala_img(new_width, new_height, img):
    
    old_width = img.getWidth()
    old_height = img.getHeight()

    #width
    diff_width =  old_width - new_width
    while diff_width > 0:
        x = 1
        if x % 2 == 0:
            for row in range(old_height):
                img.remove(img[row][old_height - 4])
                x += 1
        else:
            for row in range(old_height):
                img.remove(img[row][4])
                x += 1
    diff_width -= 1

    #height
    diff_height =  old_height - new_height
    while diff_height > 0:
        x = 1
        if x % 2 == 0:
            for row in range(old_width):
                img.remove(img[row][old_width - 4])
                x += 1
        else:
            for row in range(old_width):
                img.remove(img[row][4])
                x += 1
    diff_height -= 1

    return img
            
def ridimensiona_img():
    new_width = int(input('Inserisci larghezza in pixel: ', ))
    new_height = int(input('Inserisci altezza in pixel: ', ))
    img = cImage.Image('immagine.gif')
    width = img.getWidth()
    height = img.getHeight()
    finestra = cImage.ImageWin('Drago sulla Luna @ctr_design7', new_width, new_height)
    newimg = cImage.EmptyImage(width,height)

    for riga in range(height):
        for colonna in range(width):
            old_pixel = img.getPixel(colonna,riga)
            r = old_pixel.getRed()
            g = old_pixel.getGreen()
            b = old_pixel.getBlue()
            new_pixel = cImage.Pixel(r,g,b)
            newimg.setPixel(colonna,riga,new_pixel)

    matrice_immagine = []

    for rw in range(height):
        for cl in range(width):
            matrice_immagine.append(newimg[rw][cl])
            
    scala_img(new_width, new_height, matrice_immagine)
            
    newimg.draw(finestra)
L'altra funzione come vi dicevo è la rotazione di 90 gradi a destra e poi avrei finito... anche su questa ho elaborato qualcosina ma non riesco ancora a farla andare... per adesso magari cerco di risolvere il primo problema, poi vedremo ahah :)

Vi ringrazio tanto della pazienza e dell'aiuto :)
 

Reeaver

Utente Attivo
1,170
128
Hardware Utente
CPU
AMD RYZEN 5 1600
Dissipatore
NOCTUA NH-U12S
Scheda Madre
MSI B350 TOMAHAWK
Hard Disk
SSD SAMSUNG 850 250 GB + WD CAVIAR BLUE 1TB
RAM
HYPER X 16GB 2400MHz DDR4 LP
Scheda Video
ASUS ROG STRIX GTX1070 O8GB
Scheda Audio
INTEGRATA
Monitor
SAMSUNG C24F390
Alimentatore
SEASONIC SSR-550M
Case
NZXT S340
Periferiche
MOUSE, TASTIERA, MANI
Internet
FIBRA FTTH 1GB
Sistema Operativo
WINDOWS 10 PRO 64-BIT
Perchè non OpenCv ?
 

Cotrox

Nuovo Utente
Ok capisco raga, allora provo da solo a ragionarci su e vedere se ne vengo fuori in qualche modo... ultima noia che vi do... ogni volta che uso il for finisco per incasinarmi e trovo rimedio con il while... (o almeno mi capita spesso).. ora ad esempio sto incasinato perchè credo di aver capito male qualcosa... se io devo andare a modificare dei valori di una matrice o meglio.. tutti i suoi valori.. come mai mi da errore? Come dovrei invece scriverlo?
Codice:
'''Supponiamo di avere una Matrice e di doverne creare una di uguali dimensioni ma con tutti 0 '''
M = [ [0,1,2], [1,2,3], [2,3,4] ]

N = []
for row in M:
    for col in row:
        N[row][col] = 0

#NON FUNZIONA QUESTO METODO :/ cosa sbaglio?
 

clessidra

Utente Attivo
429
77
Hardware Utente
CPU
VIA C3
Scheda Video
Ati Rage
Sistema Operativo
linux - Red Hat 1.1
Gli errori dovrebbero essere:
- l'assegnamento è valido per sostituire, non per creare elementi; quindi in caso di lista vuota bisogna usare il metodo append().
- row e col non sono iterabili: io sposterei il ciclo sulla lunghezza delle liste o sul metodo iter().
Post automaticamente unito:

Nella documentazione ufficiale c'è un esempio di quello che cerchi:
Python:
matrix = [
    [1, 2, 3, 4],
    [5, 6, 7, 8],
    [9, 10, 11, 12],
]

transposed = []
for i in range(4):
    transposed_row = []
    for row in matrix:
        transposed_row.append(row[i])
    transposed.append(transposed_row)

>>> transposed
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
 
Ultima modifica:

Cotrox

Nuovo Utente
Gli errori dovrebbero essere:
- l'assegnamento è valido per sostituire, non per creare elementi; quindi in caso di lista vuota bisogna usare il metodo append().
- row e col non sono iterabili: io sposterei il ciclo sulla lunghezza delle liste o sul metodo iter().
Post automaticamente unito:

Nella documentazione ufficiale c'è un esempio di quello che cerchi:
Python:
matrix = [
    [1, 2, 3, 4],
    [5, 6, 7, 8],
    [9, 10, 11, 12],
]

transposed = []
for i in range(4):
    transposed_row = []
    for row in matrix:
        transposed_row.append(row[i])
    transposed.append(transposed_row)

>>> transposed
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
allora mi sono aiutato con la questione del .append ma ho provato a fare diversamente secondo mio ragionamento e torno allo stesso problema maledizione ahahah se puoi darci un'occhiata per favore...

In pratica ho creato una prima funziona che crea un duplicato e poi lavoro sul duplicato per la rotazione con la seconda funzione ma qualcosa non va per il solito motivo...

Codice:
''' Creo una matrice 'novanta' di dimensioni uguali alla precedente con righe
    e colonne invertite (3x4 to 4x3).

    La seconda funzione invece ruota i valori della prima matrice di 90° '''

def crea_duplicato(matrice, novanta):
    for row in matrice:
        new_row = []
        for col in range(len(row)):
            new_row.append(row[col])
        novanta.append(new_row)

def ruota_novanta_gradi(m,n):
    for row in m:
        i = 1
        for col in range(len(row)):
            n[row][col] = m[col][len(row) - i]
            if i == len(row):
                i = 0
            else:
                i += 1
                
matrice = [ [1, 2, 3, 4],
           [5, 6, 7, 8],
           [9, 10, 11, 12] ]

novanta = []
            
crea_duplicato(matrice, novanta)       
ruota_novanta_gradi(matrice, novanta)
 

clessidra

Utente Attivo
429
77
Hardware Utente
CPU
VIA C3
Scheda Video
Ati Rage
Sistema Operativo
linux - Red Hat 1.1
Bisogna anche considerare la direzione della rotazione di 90°, a sinistra (con ruota_novanta_gradi_s) o a destra (con ruota_novanta_gradi_d).
In entrambi i casi il semplice metodo reverse() basta, oltre all'esempio che ti ho già postato:
Python:
def crea_duplicato(matrice, novanta):
    for row in matrice:
        new_row = []
        for col in range(len(row)):
            new_row.append(row[col])
        novanta.append(new_row)

def ruota_novanta_gradi_d(m,n):
    for i in range(4):
        transposed_row = []
        for row in m:
            transposed_row.append(row[i])
        n.append(transposed_row)

matrice2 = []
crea_duplicato(matrice, matrice2)
matrice2.reverse()
ruota_novanta_gradi_d(matrice2, novanta)

novanta = []
def ruota_novanta_gradi_s(m,n):
    for i in range(4):
        transposed_row = []
        for row in m:
            transposed_row.append(row[i])
        n.append(transposed_row)        

ruota_novanta_gradi_s(matrice, novanta)
novanta.reverse()
 
Ultima modifica:
Stato
Discussione chiusa ad ulteriori risposte.

Entra

oppure Accedi utilizzando