Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    487

    [C++] Salvare un tipo BYTE in un file

    Io dovrei salvare i valori RGB di un immagine in un file (es .txt), inizialmente ho stampato semplicemente i valori sotto forma di int, esiste un metodo per stampare direttamente il tipo BYTE, così ogni tre byte c'è il valore di colore di un pixel, anzichè ogni 9 byte?

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Il discorso che hai fatto è alquanto confuso ... ci mostri il codice con cui ottieni il valore del colore e cosa vorresti ottenere nel file .txt ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    487

    Ok

    Allora parte del codice lo ho ricavato da un precedente post di MItaly

    Nel codice ci sono delle cose che non centrano (es include in più, ma è perchè il codice avrebbe altre parti ma non centrano con il porblema).
    Codice PHP:
    #include <string.h>
    #include <sstream> //Per stampare le variabili sui box
    #include <string>  //Per stampare le variabili sui box
    #include <stdlib.h> //Random
    #include <time.h>
    #include <conio.h>
    #include <string.h> 
    #include <time.h> 
    #include <windows.h>
    #include <stdio.h>
    #include <stdexcept>  
    #include <cstdlib> //To enable writing on a file
    #include <fstream> //To enable writing on a file



    using namespace std



    // Rappresenta un pixel in una DIB a 24 bpp
        
    struct DIB24BPPPixel
        
    {
        
    BYTE Blue;
        
    BYTE Green;
        
    BYTE Red;
        };

    void ControllaSchermo1(void);


    POINT coord;        /* struct contenente le coordinate xy del mouse */


    string s;
    string c;
    stringstream out;


    int xy;
    char charRGBstring;

    void Stampa (string);

    int main()

    {
    ControllaSchermo1();
        





        
        return 
    0;
    }

    void Stampa (string s)
    {
    FILE *file;
                       

    //MessageBox(NULL,"","",0);                        


    charRGBstring = new char[9869757];
    charRGBstring = (char*) s.c_str();
    file fopen("C:\\Users\\Niko\\Desktop\\RGB.txt","a");
         

    fprintf(file,charRGBstring,0);
          

    fclose(file);

    }


    void ControllaSchermo1()
    // MessageBox(NULL, "Controlla schermo", "Cubo", 0);
        
        // I device context
        
    HDC dibDC=NULLscreenDC=NULL;
        
    // Larghezza e altezza dello schermo (e di conseguenza della DIB)
        
    LONG widthheight;
        
    // Bitmap selezionata all'inizio in dibDC, DIB Section
        
    HBITMAP oldBmp=NULLdibSection=NULL;
        
    // Puntatore ai dati della DIB
        
    LPBYTE dibBits=NULL;
        
    // Struttura utilizzata per inizializzare la DIB
        
    BITMAPINFO bi={0};
        try
        {
            
    // I device context
            
    HDC dibDC=NULLscreenDC=NULL;
            
    // Larghezza e altezza dello schermo (e di conseguenza della DIB)
            
    LONG widthheight;
            
    // Bitmap selezionata all'inizio in dibDC, DIB Section
            
    HBITMAP oldBmp=NULLdibSection=NULL;
            
    // Puntatore ai dati della DIB
            
    LPBYTE dibBits=NULL;
            
    // Struttura utilizzata per inizializzare la DIB
            
    BITMAPINFO bi={0};
            
    // Lunghezza di una riga della DIB in byte; ci torna utile averlo pronto visto che le righe devono essere allineate a 32 bit
            
    size_t bytesPerLine=0;
            
    // Ottiene le dimensioni dello schermo
            
    width = (LONGGetSystemMetrics(SM_CXFULLSCREEN);
            
    height = (LONGGetSystemMetrics(SM_CYFULLSCREEN);
            
    // Calcola la lunghezza di una riga della DIB
            
    bytesPerLine = ((width 24 31) & (~31)) / 8;
            
    // Ottiene l'handle al DC dello schermo
            
    screenDC GetDC(0);
            if(
    screenDC == NULL)
                throw 
    std::runtime_error("Impossibile ottenere il DC dello schermo; GetDC ha restituito NULL.");
            
    // Inizializza i dati della DIB
            
    bi.bmiHeader.biSize=sizeof(bi.bmiHeader);
            
    bi.bmiHeader.biWidth=width;
            
    bi.bmiHeader.biHeight=height;
            
    bi.bmiHeader.biPlanes=1;
            
    bi.bmiHeader.biBitCount=24/* per semplicità usiamo una DIB a 24 bpp qualunque sia la profondità di colore dello schermo */
            
    bi.bmiHeader.biCompression=BI_RGB;
            
    // Crea la DIB section
            
    dibSection=CreateDIBSection(NULL, &biDIB_RGB_COLORS, (LPVOID *)&dibBitsNULL0);
            if(
    dibSection == NULL)
                throw 
    std::runtime_error("Impossibile creare la DibSection; CreateDIBSection ha restituito NULL.");
            
    // Crea il DC
            
    dibDC CreateCompatibleDC(NULL);
            if(
    dibDC == NULL)
                throw 
    std::runtime_error("Impossibile creare il device context; CreateCompatibleDC ha restituito NULL.");
            
    // Seleziona la DIB section nel DC e salva la bitmap di default attualmente contenuta nel DC
            
    oldBmp == SelectObject(dibDCdibSection);
            
            
            for(
    int d=0;d<1;d++)
            {   
    //MessageBox(NULL, "CICLO PIXEL", "Pixel", MB_ICONINFORMATION);
                // Ciclo da ripetere per ogni controllo dello schermo
                // Copia il contenuto dello schermo nella DIB section
                
    BitBlt(dibDC0,0widthheightscreenDC00SRCCOPY);
                
    // Qui controlla i pixel della DIB

                        
                
    for(0800y++)
                {
                    
    // Ottiene un puntatore al primo pixel della riga
                    
    DIB24BPPPixel rowPtr = (DIB24BPPPixel *) (dibBits+(height-1-y)*bytesPerLine);
                    for(
    01280x++)
                    {
                        
                        
    // Verifica il colore del pixel
                        // Esempio:
                        
    += rowPtr[x].Red;
                        
                        
    += rowPtr[x].Green;
                        
                        
    += rowPtr[x].Blue;
                        
                        if(
    == 0){Stampa(s);
                        
    "";}
                        
                        
    out.str("");

                        
    out << y;
                        
    out.str();
      

                        
    //if(y>=3&&x==100)MessageBox(NULL,c.c_str(),  "y", 0);    
        

                        
                        
                    
    }
                }
    //fine for
               
            
            
    //fine else
            // Cleanup
            
    ReleaseDC(NULLscreenDC);
            
    SelectObject(dibDColdBmp);
            
    DeleteDC(dibDC);
            
    DeleteObject(dibSection);
        }
        catch(...)
        {
            
    // Cleanup in caso di errore
            
    if( screenDC != NULL)
                
    ReleaseDC(NULLscreenDC);
            if(
    dibDC != NULL)
            {
                
    SelectObject(dibDColdBmp);
                
    DeleteDC(dibDC);
            }
            if(
    dibSection != NULL)
                
    DeleteObject(dibSection);
            
    // Propaga l'eccezione
            
    throw;
        }

    Il codice analizza i pixel dello schermo e dovrebbe stampare in totale esattamente 1280*800*3 byte. Gli errori sono 2.
    Uno, quando y arriva al valore di 748 va in crash.
    Due nella stampa su file c'è qualche problema e crasha.

    Ciao

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.