Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione Zenfone 11 Ultra: il flagship ASUS ritorna a essere un 'padellone'
Recensione Zenfone 11 Ultra: il flagship ASUS ritorna a essere un 'padellone'
Zenfone 11 Ultra ha tantissime qualità interessanti, fra cui potenza da vendere, un display di primissimo livello, un comparto audio potente e prestazioni di connettività fra le migliori della categoria. Manca però dell'esclusività del predecessore, che in un settore composto da "padelloni" si distingueva per le sue dimensioni compatte. Abbiamo provato il nuovo flagship ASUS, e in questa recensione vi raccontiamo com'è andata.
Appian: non solo low code. La missione è l’ottimizzazione dei processi con l'IA
Appian: non solo low code. La missione è l’ottimizzazione dei processi con l'IA
Abbiamo partecipato ad Appian World 2024, evento dedicato a partner e clienti che si è svolto recentemente nei pressi di Washington DC, vicino alla sede storica dell’azienda. Nel festeggiare il 25mo anniversario, Appian ha annunciato diverse novità in ambito intelligenza artificiale
Lenovo ThinkVision 3D 27, la steroscopia senza occhialini
Lenovo ThinkVision 3D 27, la steroscopia senza occhialini
Primo contatto con il monitor Lenovo ThinkVision 3D 27 che grazie a particolari accorgimenti tecnici riesce a ricreare l'illusione della spazialità tridimensionale senza che sia necessario utilizzare occhialini
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


Recensione Zenfone 11 Ultra: il flagship ASUS ritorna a essere un 'padellone' Recensione Zenfone 11 Ultra: il flagship ASUS ri...
Appian: non solo low code. La missione è l’ottimizzazione dei processi con l'IA Appian: non solo low code. La missione è ...
Lenovo ThinkVision 3D 27, la steroscopia senza occhialini Lenovo ThinkVision 3D 27, la steroscopia senza o...
La Formula E può correre su un tracciato vero? Reportage da Misano con Jaguar TCS Racing La Formula E può correre su un tracciato ...
Lenovo LEGION e LOQ: due notebook diversi, stessa anima gaming Lenovo LEGION e LOQ: due notebook diversi, stess...
La Cina ha lanciato la missione Shenzhou...
La sonda spaziale NASA Psyche comunica v...
Dacia Duster, prima guida: con le versio...
Google Pixel 8 Pro 256 GB a 928€ (minimo...
Arriva l'ok da Parlamento europeo sul di...
RISC-V: l'uso dell'ISA open-source da pa...
Amazon scatenata: iPad a 399€, airfryer ...
SK hynix, costruzione della Fab M15X ai ...
Oggi 459€ per utenti Prime il portatile ...
Sta per succedere! La prima gara a guida...
Parthenope: un nuovo RPG investigativo t...
Urbanista Malibu: ecco come va la cassa ...
Gas Station Simulator è costato 1...
AOC Graphic Pro U3, tre nuovi monitor pe...
Wacom Movink: per la prima volta il disp...
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: 01:10.


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