Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Come rispettare tutte le nuove regole per i monopattini elettrici? La guida per non rischiare sanzioni
Come rispettare tutte le nuove regole per i monopattini elettrici? La guida per non rischiare sanzioni
Sono ormai definitive le nuove norme del Codice della Strada per i monopattini elettrici. Non solo targa e assicurazione, le regole sono tante e riguardano diversi aspetti, vi spieghiamo come evitare sanzioni che possono essere salate
DLSS 4.5: con Dynamic Frame Generation e MFG 6X NVIDIA alza la posta
DLSS 4.5: con Dynamic Frame Generation e MFG 6X NVIDIA alza la posta
DLSS 4.5 introduce Dynamic Multi Frame Generation e MFG 6X, permettendo fino a cinque frame generati per ogni frame renderizzato. I test su Cyberpunk 2077 e 007 First Light mostrano forti incrementi di FPS e riduzione della latenza su RTX 5090 Laptop. Migliorano fluidità, stabilità e qualità visiva.
Plaud NotePin S, il registratore IA si fa indossabile (ma è facile da perdere)
Plaud NotePin S, il registratore IA si fa indossabile (ma è facile da perdere)
Quattro modi di indossarlo, stessa app del Plaud Note Pro e integrazione con il desktop. Il registratore IA da indossare di Plaud eccelle in mobilità, ma resta vincolato all'abbonamento ed è facile da perdere
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


Come rispettare tutte le nuove regole per i monopattini elettrici? La guida per non rischiare sanzioni Come rispettare tutte le nuove regole per i mono...
DLSS 4.5: con Dynamic Frame Generation e MFG 6X NVIDIA alza la posta DLSS 4.5: con Dynamic Frame Generation e MFG 6X ...
Plaud NotePin S, il registratore IA si fa indossabile (ma è facile da perdere) Plaud NotePin S, il registratore IA si fa indoss...
Redmi Watch 6 in prova: lo smartwatch con ampio display da 2000 nit a meno di 100 euro Redmi Watch 6 in prova: lo smartwatch con ampio ...
Mad Catz M.M.O. 7+: lo stesso DNA del R.A.T. 8+ ADV, ma con molti più pulsanti Mad Catz M.M.O. 7+: lo stesso DNA del R.A.T. 8+ ...
Fable 5, il modello Mythos per tutti: gr...
Costruire sulla Luna: i test per le futu...
La NASA ha annunciato gli astronauti del...
Mondiale 2026, Lenovo unico partner tecn...
007 First Light ha venduto più di...
Harley-Davidson, svelato il prezzo itali...
PC Windows 11 in crash: ma la colpa è di...
Dopo i 'NO 5G' arrivano i 'NO FIBRA'? Ar...
Promettono un parco e costruiscono un da...
L'aeroplano supersonico ''silenzioso'' N...
Euro-Office sbugiardata da LibreOffice: ...
I 10 sconti TOP Amazon: 4 novità ...
Galaxy Z Flip 8, in Europa avrà i...
SpaceX annuncia i satelliti AI1 destinat...
Ariston DEOS 10 EVO a 103€: deumidificat...
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: 19:57.


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