Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI
Con velocità teoriche fino a 11 Gbps, gestione tramite app intelligente e protezione avanzata dei dispositivi, Roamii BE Pro porta il Wi‑Fi 7 tri‑band nelle abitazioni più esigenti. Un sistema Wi-Fi Mesh proposto da MSI allo scopo di garantire agli utenti una rete fluida e continua capace di sostenere streaming 8K, gaming competitivo e le applicazioni moderne più esigenti in termini di banda
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi
Mate X7 rinnova la sfida nel segmento dei pieghevoli premium puntando su un design ancora più sottile e resistente, unito al ritorno dei processori proprietari della serie Kirin. L'assenza dei servizi Google e del 5G pesa ancora sull'esperienza utente, ma il comparto fotografico e la qualità costruttiva cercano di compensare queste mancanze strutturali con soluzioni ingegneristiche di altissimo livello
Nioh 3: souls-like punitivo e Action RPG
Nioh 3: souls-like punitivo e Action RPG
Nioh 3 aggiorna la formula Team NINJA con aree esplorabili più grandi, due stili di combattimento intercambiabili al volo (Samurai e Ninja) e un sistema di progressione pieno di attività, basi nemiche e sfide legate al Crogiolo. La recensione entra nel dettaglio su combattimento, build, progressione e requisiti PC
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 11-02-2011, 10: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 18:48.
Franc[e]sco è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo M...
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi Recensione HUAWEI Mate X7: un foldable ottimo, m...
Nioh 3: souls-like punitivo e Action RPG Nioh 3: souls-like punitivo e Action RPG
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti Test in super anteprima di Navimow i220 LiDAR: i...
Dark Perk Ergo e Sym provati tra wireless, software via browser e peso ridotto Dark Perk Ergo e Sym provati tra wireless, softw...
Funzionalità top a un prezzo acce...
Lo strumento per gli aggiornamenti autom...
Imperdibile sconto sul roborock Saros Z7...
Google Pixel 10, altri 100€ di sconto su...
Chip sotto i 2 nanometri, l'Europa alza ...
La smart meno smart di tutte: #6 in azio...
Red Hat Enterprise Linux sbarca su AWS E...
Addio alle migliaia di cicli e anni di t...
Colpo di STMicroelectronics, un'intesa d...
La Ferrari elettrica si chiama Luce: ecc...
Proseguono le riparazioni in vista del l...
Cinema domestico low cost: proiettore Fu...
Sharp porta a ISE 2026 i nuovi display i...
Casa più sicura senza lavori: Arl...
Batterie esauste, l'Italia raccoglie sol...
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: 20:34.


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