Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Tre giorni in Finlandia con OnePlus Watch 2 Nordic Blue. La nostra prova a temperature estreme
Tre giorni in Finlandia con OnePlus Watch 2 Nordic Blue. La nostra prova a temperature estreme
Siamo volati a Helsinki, in Finlandia, per testare a fondo il nuovo OnePlus Watch 2 Nordic Blue Edition. L'orologio ci ha convinti durante i test invernali a Helsinki, grazie al design raffinato, alle prestazioni impeccabili, alla resistenza agli ambienti estremi e all'ottima autonomia garantita dalla modalità intelligente.
Lenovo Factory Tour: siamo entrati nella fabbrica ungherese che produce PC, storage e server
Lenovo Factory Tour: siamo entrati nella fabbrica ungherese che produce PC, storage e server
Edge9 ha visitato lo stabilimento produttivo di Lenovo nei pressi di Budapest in Ungheria, che serve tutta la zona EMEA per i prodotti “business”: PC, storage e server. Un impianto all’avanguardia, con altissimi tassi di efficienza ma anche una grande attenzione alle condizioni lavorative dei dipendenti e alla sostenibilità ambientale
Acer Nitro V 15, alla prova il notebook gaming essenziale con RTX 4050 Laptop
Acer Nitro V 15, alla prova il notebook gaming essenziale con RTX 4050 Laptop
Acer Nitro V 15 è un notebook gaming che punta sul rapporto prezzo-prestazioni per garantire a chi ha un budget intorno o persino inferiore ai 1000€ di giocare abbastanza bene in Full HD grazie alla RTX 4050 Laptop di NVIDIA e la compatibilità con il DLSS 3.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 11-02-2011, 09:51   #1
Franc[e]sco
Junior Member
 
L'Avatar di Franc[e]sco
 
Iscritto dal: Feb 2011
Messaggi: 1
[C++] Problema con gli Header BMP

Ciao a tutti, mi sono appena iscritto e ho un problemino con gli header BMP. Volevo imparare a scrivere immagini bmp in c++ e così ho fatto un programmino di prova dove ho riprodotto la struttura dell'header seguendo lo schema di wikipedia. Questo programmino ti fa inserire le dimensioni dell'immagine e la genera riempiendola di rosso. Il problema è che per qualche strano motivo se l'immagine supera i 51x51 il programma comincia a comportarsi in modo strano:
51x51 = immagine corrotta
52x52 e oltre = si vede ma i pixel sono tutti sfasati (ogni riga di pixel è di un colore diverso, suppongo che manchi qualche byte da qualche parte che fa sfasare tutto)

Inizialmente ho pensato che l'array dei pixel si fosse incasinato, ma stampandolo sembra tutto a posto. Non riesco proprio a capire quale sia il problema, eccovi il source:

EDIT: Corretti alcuni errori con le dimensioni ma continua a dare lo stesso problema e con dimensioni piu piccole adesso
RI-EDIT: L'ho riprogrammato con l'alloineamento di bytes corretto ma continua a dare lo stesso problema x_x
RI-RI-EDIT: Riprogrammato utilizzando le struct degi header fornite in Windows.h, solito problema x___x

pastebin -> Click
Codice:
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <Windows.h>
using namespace std;

int main() {
    unsigned long width = 0,
				  height = 0,
				  imagesize = 0;
    PBITMAPFILEHEADER h = NULL;
    PBITMAPINFOHEADER p = NULL;
    RGBTRIPLE *pixels = NULL;
    FILE *file = NULL;
    WORD padding = 0; // Padding, separatore delle righe

    cout << "Inserisci la larghezza dell'immagine: ";
    cin >> width;
    cout << "Inserisci l'altezza dell'immagine: ";
    cin >> height;
    imagesize = width*height;

    cout << "\nPopolando " << imagesize << " pixels... ";
    pixels = new RGBTRIPLE[imagesize];
    ZeroMemory(pixels, sizeof(RGBTRIPLE)*imagesize);
    if(pixels != NULL){
        for(unsigned long i=0; i<imagesize; i++){
            pixels[i].rgbtBlue  = 0;
            pixels[i].rgbtGreen = 0;
            pixels[i].rgbtRed   = 0xFF; // Rosso
        }
        cout << "Fatto!\n";
    } else cout << "Errore - Array dei pixel non allocato.\n";

    cout << "Generando l'header... ";

    // BMP Header
    h = new BITMAPFILEHEADER;
    ZeroMemory(h, sizeof(BITMAPFILEHEADER));
    h->bfType = 0x4D42; // BM (Windows)
    h->bfSize = sizeof(BITMAPFILEHEADER) +
                sizeof(BITMAPINFOHEADER) +
                sizeof(RGBTRIPLE)*imagesize +
                sizeof(padding)*height;
    h->bfOffBits = 54;

    // DIB Header
    p = new BITMAPINFOHEADER;
    ZeroMemory(p, sizeof(BITMAPINFOHEADER));
    p->biSize = 40;
    p->biWidth = width;
    p->biHeight = height;
    p->biPlanes = 1;
    p->biBitCount = 24;
    p->biSizeImage = sizeof(RGBTRIPLE)*imagesize +
                     sizeof(padding)*height;
    p->biXPelsPerMeter = 2835;
    p->biYPelsPerMeter = 2835;
    cout << "Fatto!\n";

    cout << "Creando il file... ";
    file = fopen("test.bmp", "wb+");
    if(file != NULL){
        cout << "Creato!\n";

        // Header
        cout << "Scrivendo l'header su file... ";
        if(h != NULL && p != NULL){
            fwrite (h, sizeof(BITMAPFILEHEADER), 1, file); // BMP Header
            fwrite (p, sizeof(BITMAPINFOHEADER), 1, file); // DIB Header
            cout << "Fatto! (" << sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) << " bytes)\n";

           // Pixels
            cout << "Scrivendo l'immagine... ";
            if(pixels != NULL){
                unsigned long pos = width * height; // Parte dall'ultima riga di pixels
                while (pos != 0) {
                    for (unsigned long n = 0; n<width; n++) // Scrive tutti i pixel della riga
                        fwrite (&pixels[pos - width + n], sizeof(RGBTRIPLE), 1, file);
                    fwrite (&padding, sizeof(padding), 1, file); // 2 Bytes di Padding
                    pos -= width; // Va indietro di una riga
                }
                cout << "\nFatto! (" << p->biSizeImage << " bytes)\n";
            } else cout << "Errore - Array dei pixel non allocato.\n";
        } else cout << "Errore - Header non allocato.\n";

        cout << "Dimensione totale file: " << h->bfSize << " bytes.\n";
    } else cout << "Errore Scrittura!\n";

    // Cleanup Memoria
    delete[] pixels;
    delete(h);
    delete(p);

    _getch();
    return 0;
}
__________________

Ultima modifica di Franc[e]sco : 11-02-2011 alle 17:48.
Franc[e]sco è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Tre giorni in Finlandia con OnePlus Watch 2 Nordic Blue. La nostra prova a temperature estreme Tre giorni in Finlandia con OnePlus Watch 2 Nord...
Lenovo Factory Tour: siamo entrati nella fabbrica ungherese che produce PC, storage e server Lenovo Factory Tour: siamo entrati nella fabbric...
Acer Nitro V 15, alla prova il notebook gaming essenziale con RTX 4050 Laptop Acer Nitro V 15, alla prova il notebook gaming e...
Stellar Blade: l'action RPG di Shift Up sfoggia uno stile (quasi) unico su PS5 - Recensione Stellar Blade: l'action RPG di Shift Up sfoggia ...
Recensione Zenfone 11 Ultra: il flagship ASUS ritorna a essere un 'padellone' Recensione Zenfone 11 Ultra: il flagship ASUS ri...
Amazon Seconda Mano (ex Warehouse): ecco...
Warren Buffett: l'intelligenza artificia...
La serie Realme 12 5G arriva in Italia p...
Incentivi auto elettriche annunciati ma ...
SpaceX presenta le tute spaziali per l'a...
Splunk State of Security 2024: cos&igrav...
Boom di investimenti per la produzione d...
Come disabilitare gli annunci pubblicita...
Joby Aviation ha completato i test di pr...
Apple 'Let Loose': cosa aspettarsi dall'...
Proton 9 rimuove il limite dei core: mig...
Robot viene picchiato con un bastone nel...
Disponibile Amazon Q, l'assistente IA di...
Private AI: disponibili i Server GPU ded...
Nintendo: i giochi acquistati? Non potet...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 16:22.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Served by www3v