Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2011
    Messaggi
    55

    [C++] Trasformare un txt in bmp

    Praticamente posto che so tranquillamente leggere da file come posso scrivere una bitmap in c++ senza usare librerie?

    L'unica a disposizione è OpenCV ma finora ho trovato solo il contrario, ossia leggere da bitmap i vari valori RGB e trasformarli in file di testo...
    Possibile che non esista una funzione al contrario?

  2. #2
    Ma vuoi convertire un txt contenente i dati dell'immagine (in che formato?) in una bmp o vuoi scrivere una bmp da dei dati che hai in memoria?
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2011
    Messaggi
    55
    Praticamente ho una matrice di interi in memoria...Io l'ho portata su file txt, ma posso anche lavorare dalla memoria senza leggere da file (forse è piu facile?)...

    Da qui dovrei assegnare un colore per ogni intero riuscendo ad avere quindi una bitmap formata da n regioni...

    ho usato opencv per creare una bitmap col comando imwrite...
    Ora come potrei fare?

  4. #4
    Originariamente inviato da iamwill
    Praticamente ho una matrice di interi in memoria...Io l'ho portata su file txt, ma posso anche lavorare dalla memoria senza leggere da file (forse è piu facile?)...
    Sì, è più facile.
    Da qui dovrei assegnare un colore per ogni intero riuscendo ad avere quindi una bitmap formata da n regioni...
    Le n regioni sono più o meno di 256?
    ho usato opencv per creare una bitmap col comando imwrite...
    Ora come potrei fare?
    Ma se l'hai già creata allora qual è il problema? O stai dicendo "in passato ho usato imwrite per scrivere bitmap ma non so come impiegarla adesso"?
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it
    Registrato dal
    Aug 2011
    Messaggi
    55
    Ok allora lavorerò in memoria...

    Le regioni sono sempre 5...ossia uno sfondo e 4 figure che sono sempre diverse...

    Mi spiego meglio:

    ho creato col comando imwrite la mia bmp, ma ora come faccio a scriverla?

    La mia domanda è come fare a scrivere un pixel nell'immagine se trovo la regione contrassegnata con lo 0? e quella con l'1?

    non riesco a trovare nulla googlando...


    questo il comando per crearla...

    Mat watermark(120, 160, CV_8UC3);
    imwrite("C:\\watermark.bmp", watermark);


    ora per scriverci sopra?

  6. #6
    imwrite va richiamato alla fine, al momento di scrivere la bitmap su file; in altre parole, prima scrivi in watermark, poi scrivi su file. Comunque: stabilisci i colori che dovranno avere le singole regioni e mettili in un array il cui indice corrisponde all'indice della regione nella tua matrice di interi:
    codice:
    Vec3b colors[5];
    colors[0]=Vec3b(0, 0, 0); // nero
    colors[1]=Vec3b(127, 127, 127); // grigio 50%
    colors[2]=Vec3b(255, 0, 0); // rosso
    colors[3]=Vec3b(0, 255, 0); // verde
    colors[4]=Vec3b(0, 0, 255); // blu
    quindi crea l'immagine e piazza su ogni pixel il colore corrispondente nella tua "matrice originale" (che qui chiamerò "mo"):
    codice:
    Mat watermark(120, 160, CV_8UC3);
    for(int x=0; x<120; ++x)
        for(int y=0; y<160; ++y)
            watermark.at<Vec3b>(x, y)=colors[mo[x][y]];
    infine, scrivi il risultato su file:
    codice:
    imwrite("watermark.bmp", watermark);
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Utente di HTML.it
    Registrato dal
    Aug 2011
    Messaggi
    55
    invalid types 'cv::Vec3b [(((unsigned int)(((int)countReg) + -0x000000001)) + 1)][float]' for array subscript


    Mi da quest'errore sulla linea di watermark.at


    Comunque innanzitutto grazie davvero mille per la spiegazione...ora ho anche trovato delle pagine che mi spiegano come fare...Nella varia documentazione di opencv

    Mi metto a studiarle per bene

    Vedrò cosa tiro fuori....

  8. #8
    Originariamente inviato da iamwill
    invalid types 'cv::Vec3b [(((unsigned int)(((int)countReg) + -0x000000001)) + 1)][float]' for array subscript


    Mi da quest'errore sulla linea di watermark.at
    Non c'è nessun float né alcun countReg nel codice che ho scritto... puoi postare il codice che stai effettivamente compilando?
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    Utente di HTML.it
    Registrato dal
    Aug 2011
    Messaggi
    55
    Bè considera che è un progetto e la matrice finale su cui devo lavorare è chiamata MatrixRegion, mentre il countReg è il contatore delle regioni che avevo chiamato prima...

    Effettivamente potrei anche fare una funzione e richiamarla...

    Questo il codice modificato con i vari nomi (endRows e endColumns sono righe e colonne della matrice finale)



    codice:
    Vec3b colors[countReg]; 
    colors[0]=Vec3b(255, 0, 0); // rosso
    colors[1]=Vec3b(127, 127, 127); // grigio 50% 
    colors[2]=Vec3b(0, 0, 0); // nero
    colors[3]=Vec3b(0, 0, 0); // verde 
    colors[4]=Vec3b(0, 0, 255); // blu 
    Mat watermark(endRows, endColumns, CV_8UC3); 
    for(int i=0; i<endRows; i++) 
    for(int j=0; j<endColumns; j++) 
    watermark.at<Vec3b>(i, j)=colors[MatrixRegion[i][j]]; 
    imwrite("watermark.bmp", watermark);

  10. #10
    Se countReg non è una costante non puoi usare un array allocato sullo stack (o almeno, non è ammesso dallo standard); puoi usare invece un std::vector:
    codice:
    std::vector<Vec3b> colors(countReg); 
    colors[0]=Vec3b(255, 0, 0); // rosso
    colors[1]=Vec3b(127, 127, 127); // grigio 50% 
    colors[2]=Vec3b(0, 0, 0); // nero
    colors[3]=Vec3b(0, 0, 0); // verde 
    colors[4]=Vec3b(0, 0, 255); // blu
    Quanto alla riga di "at": com'è dichiarata MatrixRegion?
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.