[C++] "smieci" przy ladowaniu bitmapy do vectora

0

Troche zmienilem temat :) nie wiem jak to inaczej nazwac :)

Program wczytuje plik bmp. Problem jest w tym ze

     cout<<endl<<tablica2.size()

ta linijka powoduje ze program wywala smieci, gdy ja usuna albo skomentuje bajty kolorow sa odczytywane dobrze. Moze mi ktos powiedziec czemu tak sie dzieje?

#include<stdio.h>
#include<stdlib.h>
#include <iomanip.h>
#include<iostream.h>
#include<algorithm>
#include <vector.h>
int tmp;

    struct FileHeader {
      short bfType;
      int bfSize;
      short bfReserved1;
      short bfReserved2;
      short bfOffBits;
    };
    FileHeader File;
   
    struct PictureHeader {
      int biSize;
      int biWidth;
      int biHeight;
      short biPlanes;
      short biBitCount;
      int biCompression;
      int biSizeImage;
      int biXPelsPerMeter;
      int biYPelsPerMeter;
      int biClrUsed;
      int biClrImportant;
     };
     PictureHeader Picture;

      int dlbfType;
      int dlbfSize;
      int dlbfReserved1;
      int dlbfReserved2;
      int dlbfOffBits;  
      int dlbiSize;
      int dlbiWidth;
      int dlbiHeight;
      int dlbiPlanes;
      int dlbiBitCount;
      int dlbiCompression;
      int dlbiSizeImage;
      int dlbiXPelsPerMeter;
      int dlbiYPelsPerMeter;
      int dlbiClrUsed;
      int dlbiClrImportant;  
     
     struct KoloryRGB {
      int R;
      int G;
      int B;
     };
     KoloryRGB Rgb;
     int c[8];
     char dane;

     int wielkosc_tablicy = Picture.biWidth*Picture.biHeight;
     vector <int> tablica1(wielkosc_tablicy);
     //int wielkosc_tablicy = Picture.biWidth*Picture.biHeight;
     vector <int> tablica2(wielkosc_tablicy);
     

int main() {
    FILE *f = fopen("plik1.bmp","rb");
             
     system("cls");
     printf("\n INFORMACJE O BITMAPIE\n\n");
       
     fread(&File.bfType,sizeof(File.bfType),1,f);
     dlbfType=sizeof(File.bfType);
     cout<<" Typ:"<<hex<<File.bfType<<" dlugosc "<<dlbfType<<endl;
     
     fread(&File.bfSize,sizeof(File.bfSize),1,f);
     dlbfSize=sizeof(File.bfSize);
     cout<<" Rozmiar pliku: "<<dec<<File.bfSize<<" bajtow"<<" dlugosc "<<dlbfSize<<endl;
     
         
     fread(&File.bfReserved1,sizeof(File.bfReserved1),1,f);
     dlbfReserved1=sizeof(File.bfReserved1);     
     cout<<" Zarezerwowane1: "<<File.bfReserved1<<" dlugosc "<<dlbfReserved1<<endl;
     
     fread(&File.bfReserved2,sizeof(File.bfReserved2),1,f);
     dlbfReserved2=sizeof(File.bfReserved2);
     cout<<" Zarezerwowane2: "<<File.bfReserved2<<" dlugosc "<<dlbfReserved2<<endl;
     
     fread(&File.bfOffBits,sizeof(File.bfOffBits),1,f);
     dlbfOffBits=sizeof(File.bfOffBits);
     cout<<" Pozycja danych obrazkowych: "<<File.bfOffBits<<" dlugosc "<<dlbfOffBits<<endl;
    
     
     printf("\n");
     
     fseek(f,14,SEEK_SET);
     fread(&Picture.biSize,sizeof(Picture.biSize),1,f);
     dlbiSize=sizeof(Picture.biSize);
     cout<<" Wielkosc naglowka informacyjnego: "<<Picture.biSize<<" dlugosc "<<dlbiSize<<endl;
     
     fread(&Picture.biWidth,sizeof(Picture.biWidth),1,f);
     dlbiWidth=sizeof(Picture.biWidth);
     cout<<" Szerokosc: "<<Picture.biWidth<<" pikseli dlugosc "<<dlbiWidth<<endl;
     
     fread(&Picture.biHeight,sizeof(Picture.biHeight),1,f);
     dlbiHeight=sizeof(Picture.biHeight);
     cout<<" Wysokosc: "<<Picture.biHeight<<" pikseli dlugosc "<<dlbiHeight<<endl;
     
     fread(&Picture.biPlanes,sizeof(Picture.biPlanes),1,f);
     dlbiPlanes=sizeof(Picture.biPlanes);
     cout<<" Liczba platow (zwykle 0): "<<Picture.biPlanes<<" dlugosc "<<dlbiPlanes<<endl;
     
     fread(&Picture.biBitCount,sizeof(Picture.biBitCount),1,f);
     dlbiBitCount=sizeof(Picture.biBitCount);
     cout<<" Liczba bitow na piksel: "<<Picture.biBitCount<<" (1, 4, 8, or 24)"<<" dlugosc "<<dlbiBitCount<<endl;
        
     fread(&Picture.biCompression,sizeof(Picture.biCompression),1,f);
     dlbiCompression=sizeof(Picture.biCompression);
     cout<<" Kompresja: "<<Picture.biCompression<<" (0=none, 1=RLE-8, 2=RLE-4)"<<" dlugosc "<<dlbiCompression<<endl;
     
     fread(&Picture.biSizeImage,sizeof(Picture.biSizeImage),1,f);
     dlbiSizeImage=sizeof(Picture.biSizeImage);
     cout<<" Rozmiar samego rysunku: "<<Picture.biSizeImage<<" dlugosc "<<dlbiSizeImage<<endl;
     
     fread(&Picture.biXPelsPerMeter,sizeof(Picture.biXPelsPerMeter),1,f);
     dlbiXPelsPerMeter=sizeof(Picture.biXPelsPerMeter);
     cout<<" Rozdzielczosc pozioma: "<<Picture.biXPelsPerMeter<<" dlugosc "<<dlbiXPelsPerMeter<<endl;
   
     fread(&Picture.biYPelsPerMeter,sizeof(Picture.biYPelsPerMeter),1,f);
     dlbiYPelsPerMeter=sizeof(Picture.biYPelsPerMeter);
     cout<<" Rozdzielczosc pionowa: "<<Picture.biYPelsPerMeter<<" dlugosc "<<dlbiYPelsPerMeter<<endl;
     
     fread(&Picture.biClrUsed,sizeof(Picture.biClrUsed),1,f);
     dlbiClrUsed=sizeof(Picture.biClrUsed);
     cout<<" Liczba kolorow w palecie: "<<Picture.biClrUsed<<" dlugosc "<<dlbiClrUsed<<endl;
     
     fread(&Picture.biClrImportant,sizeof(Picture.biClrImportant),1,f);
     dlbiClrImportant=sizeof(Picture.biClrImportant);
     cout<<" Wazne kolory w palecie: "<<Picture.biClrImportant<<" dlugosc "<<dlbiClrImportant<<endl;
     
     system ("pause");
     //czyta dane obrazka
     printf("\n\n Dane obrazka:\n\n");
     fseek(f,File.bfOffBits,SEEK_SET);
     
     //czyt. danych bitmapy
     int bmpImg;
     int j=0;
     
     for (int i = File.bfOffBits; i < File.bfSize;i++) {
         
      fseek(f,i,SEEK_SET);
     
      fread(&bmpImg, 1, 1, f);
      tablica1.push_back(bmpImg);
      tablica2.push_back(bmpImg);
      cout<<tablica2[j]<<endl;
      j++;     
     }
     

     
     
     cout<<tablica1.size();
     cout<<endl<<tablica2.size();
fclose(f);

system("pause");
    return 0;
}
0
BoBi1234 napisał(a)
...
    struct PictureHeader { ... };
     PictureHeader Picture;
...
     int wielkosc_tablicy = Picture.biWidth*Picture.biHeight;   //<-------------------- ?
     vector <int> tablica1(wielkosc_tablicy);
     vector <int> tablica2(wielkosc_tablicy);
...
int main()
{
....
    fread(..., &Picture.biWidth, ..);
....
    fread(..., &Picture.biHeight, ..);
....
}

popatrz na w/w wycinek i zastanow sie, ile wynosi Picture.biWidth, a ile Picture.biHeight w momencie kiedy probujesz zainicjowac zmienna wielkosc_tablicy. w ogole, zastanow sie, KIEDY ta linijka sie wykonuje, a kiedy Picture uzyskuje sensowne wartosci

0

Przyznaje blad .... banalny .... ale nadal nie radze sobie z tymi vectorami ... na tablicy statycznej mi ladnie wychodzilo a teraz jak chcĘ zrobic dynamicznie to mam klopoty, wypisuje mi ze tablica ma prawie same zera

#include<stdio.h>
#include<stdlib.h>
#include <iomanip.h>
#include<iostream.h>
#include<algorithm>
#include <vector.h>
int tmp;

    struct FileHeader {
      short bfType;
      int bfSize;
      short bfReserved1;
      short bfReserved2;
      short bfOffBits;
    };
    FileHeader File;
   
    struct PictureHeader {
      int biSize;
      int biWidth;
      int biHeight;
      short biPlanes;
      short biBitCount;
      int biCompression;
      int biSizeImage;
      int biXPelsPerMeter;
      int biYPelsPerMeter;
      int biClrUsed;
      int biClrImportant;
     };
     PictureHeader Picture;

      int dlbfType;
      int dlbfSize;
      int dlbfReserved1;
      int dlbfReserved2;
      int dlbfOffBits;  
      int dlbiSize;
      int dlbiWidth;
      int dlbiHeight;
      int dlbiPlanes;
      int dlbiBitCount;
      int dlbiCompression;
      int dlbiSizeImage;
      int dlbiXPelsPerMeter;
      int dlbiYPelsPerMeter;
      int dlbiClrUsed;
      int dlbiClrImportant;  
     
     struct KoloryRGB {
      int R;
      int G;
      int B;
     };
     KoloryRGB Rgb;
     int c[8];
     char dane;
     int temp;

     //int wielkosc_tablicy = Picture.biWidth*Picture.biHeight;
     
     

int main() {
    FILE *f = fopen("plik1.bmp","rb");
             
     system("cls");
     printf("\n INFORMACJE O BITMAPIE\n\n");
       
     fread(&File.bfType,sizeof(File.bfType),1,f);
     dlbfType=sizeof(File.bfType);
     cout<<" Typ:"<<hex<<File.bfType<<" dlugosc "<<dlbfType<<endl;
     
     fread(&File.bfSize,sizeof(File.bfSize),1,f);
     dlbfSize=sizeof(File.bfSize);
     cout<<" Rozmiar pliku: "<<dec<<File.bfSize<<" bajtow"<<" dlugosc "<<dlbfSize<<endl;
     
         
     fread(&File.bfReserved1,sizeof(File.bfReserved1),1,f);
     dlbfReserved1=sizeof(File.bfReserved1);     
     cout<<" Zarezerwowane1: "<<File.bfReserved1<<" dlugosc "<<dlbfReserved1<<endl;
     
     fread(&File.bfReserved2,sizeof(File.bfReserved2),1,f);
     dlbfReserved2=sizeof(File.bfReserved2);
     cout<<" Zarezerwowane2: "<<File.bfReserved2<<" dlugosc "<<dlbfReserved2<<endl;
     
     fread(&File.bfOffBits,sizeof(File.bfOffBits),1,f);
     dlbfOffBits=sizeof(File.bfOffBits);
     cout<<" Pozycja danych obrazkowych: "<<File.bfOffBits<<" dlugosc "<<dlbfOffBits<<endl;
    
     
     printf("\n");
     
     fseek(f,14,SEEK_SET);
     fread(&Picture.biSize,sizeof(Picture.biSize),1,f);
     dlbiSize=sizeof(Picture.biSize);
     cout<<" Wielkosc naglowka informacyjnego: "<<Picture.biSize<<" dlugosc "<<dlbiSize<<endl;
     
     fread(&Picture.biWidth,sizeof(Picture.biWidth),1,f);
     dlbiWidth=sizeof(Picture.biWidth);
     cout<<" Szerokosc: "<<Picture.biWidth<<" pikseli dlugosc "<<dlbiWidth<<endl;
     
     fread(&Picture.biHeight,sizeof(Picture.biHeight),1,f);
     dlbiHeight=sizeof(Picture.biHeight);
     cout<<" Wysokosc: "<<Picture.biHeight<<" pikseli dlugosc "<<dlbiHeight<<endl;
     
     fread(&Picture.biPlanes,sizeof(Picture.biPlanes),1,f);
     dlbiPlanes=sizeof(Picture.biPlanes);
     cout<<" Liczba platow (zwykle 0): "<<Picture.biPlanes<<" dlugosc "<<dlbiPlanes<<endl;
     
     fread(&Picture.biBitCount,sizeof(Picture.biBitCount),1,f);
     dlbiBitCount=sizeof(Picture.biBitCount);
     cout<<" Liczba bitow na piksel: "<<Picture.biBitCount<<" (1, 4, 8, or 24)"<<" dlugosc "<<dlbiBitCount<<endl;
        
     fread(&Picture.biCompression,sizeof(Picture.biCompression),1,f);
     dlbiCompression=sizeof(Picture.biCompression);
     cout<<" Kompresja: "<<Picture.biCompression<<" (0=none, 1=RLE-8, 2=RLE-4)"<<" dlugosc "<<dlbiCompression<<endl;
     
     fread(&Picture.biSizeImage,sizeof(Picture.biSizeImage),1,f);
     dlbiSizeImage=sizeof(Picture.biSizeImage);
     cout<<" Rozmiar samego rysunku: "<<Picture.biSizeImage<<" dlugosc "<<dlbiSizeImage<<endl;
     
     fread(&Picture.biXPelsPerMeter,sizeof(Picture.biXPelsPerMeter),1,f);
     dlbiXPelsPerMeter=sizeof(Picture.biXPelsPerMeter);
     cout<<" Rozdzielczosc pozioma: "<<Picture.biXPelsPerMeter<<" dlugosc "<<dlbiXPelsPerMeter<<endl;
   
     fread(&Picture.biYPelsPerMeter,sizeof(Picture.biYPelsPerMeter),1,f);
     dlbiYPelsPerMeter=sizeof(Picture.biYPelsPerMeter);
     cout<<" Rozdzielczosc pionowa: "<<Picture.biYPelsPerMeter<<" dlugosc "<<dlbiYPelsPerMeter<<endl;
     
     fread(&Picture.biClrUsed,sizeof(Picture.biClrUsed),1,f);
     dlbiClrUsed=sizeof(Picture.biClrUsed);
     cout<<" Liczba kolorow w palecie: "<<Picture.biClrUsed<<" dlugosc "<<dlbiClrUsed<<endl;
     
     fread(&Picture.biClrImportant,sizeof(Picture.biClrImportant),1,f);
     dlbiClrImportant=sizeof(Picture.biClrImportant);
     cout<<" Wazne kolory w palecie: "<<Picture.biClrImportant<<" dlugosc "<<dlbiClrImportant<<endl;
     
     system ("pause");
     //czyta dane obrazka
     printf("\n\n Dane obrazka:\n\n");
     fseek(f,File.bfOffBits,SEEK_SET);
     
     //czyt. danych bitmapy
     int wielkosc = Picture.biWidth*Picture.biHeight*3;
     vector <int> tablica1(wielkosc);
     vector <int> tablica2(wielkosc);
     int bmpImg;
     int j=0;
     
     for (int i = File.bfOffBits; i < File.bfSize;i++) {
         
      fseek(f,i,SEEK_SET);
     
      fread(&bmpImg, 1, 1, f);
      tablica1.push_back(bmpImg);
      tablica2.push_back(bmpImg);
      cout<<tablica1[j]<<endl;
      j++;     
     }
     

     
     
     cout<<tablica1.size();
     temp=tablica2.size();
     cout<<temp;

fclose(f);

system("pause");
    return 0;
}

0

a teraz to z kolei dlatego, ze konstruktor vector<T>(int N) powoduje utworzenie wektora zawierajacego N elementow rownych wartosci domyslnej (tutaj T=int wiec wart. domyslna = 0, N = wielkosc bitmapy)
http://www.cplusplus.com/reference/stl/vector/vector.html

explicit vector ( size_type n, const T& value= T(), const Allocator& = Allocator() );
Repetitive sequence constructor: Initializes the vector with its content set to a repetition, n times, of copies of value.

...zas push_back jak nazwa wskazuje, powoduje doklejenie wartosci na koniec...

stad, powykonaniu w/w kodu, konczysz z wektorzem zawierajacym { 0,0,0,0 .....,0,0,0, dane, dane..}

nie musisz rezerwowac na zas miejsca w wektorze, on sam sie 'rozciagnie'. jesli jednak chcesz zarezerwowac, to albo utworz pusty wektor konstruktorem domyslnym a potem uzyj metody vector::reserve, albo zostaw konstrukcje taka jak masz, ale nie uzywaj push_back(dane) a vector[pozycja] = dane -- czyli zwyklego wpisania do komorki, jak do tablicy

0
 
...
    int wielkosc = Picture.biWidth*Picture.biHeight*3;
     vector <int> tablica1;
     int bmpImg;
     int j=0;
     
     for (int i = File.bfOffBits; i < File.bfSize;i++) {
         
      fseek(f,i,SEEK_SET);
     
      fread(&bmpImg, 1, 1, f);
      cout<<bmpImg<<endl;
      tablica1.push_back(bmpImg);
      j++;     
}
...

Zamienilem kod na cos takiego i nadal mam wartosci w ogóle bez sensu tzn liczby ujemne -1 i -256.

0

czlowieku wez pomysl sam troche.. uzywasz wszedzie typow signed, jak odczytasz 0xFFFFFFF to nie ma co sie dziwic ze cout dostajac to jako signed wypisuje to jako -1...

nie mowiac juz o tym, ze wypisywanie tablica[j] jest bez sensu, bo ten ciag liczb Ci totalnie nic nie powie.. zeby zobaczyc cos co ma sens, musisz to rozbic na rgb+align/argb/etc, zaleznie wg. informacji o kodowaniu zapisanej w naglowku

0

To moze wytlumacz mi tylko czemu robiac tak:

//     int wielkosc = Picture.biWidth*Picture.biHeight*3;
//     vector <int> tablica1;
//      vector <int> tablica2;
     int bmpImg;
     int j=0;
     
     for (int i = File.bfOffBits; i < File.bfSize;i++) {
         
      fseek(f,i,SEEK_SET);
     
      fread(&bmpImg, 1, 1, f);
      cout<<bmpImg<<endl;
//     tablica1[j]=bmpImg;
//      tablica1.push_back(bmpImg);
//      cout<<tablica1[j];
//      tablica2.push_back(bmpImg);
//      cout<<bmpImg<<" "<<tablica1[j];//<<" "<<tablica2[j]<<endl;
      j++;     
     }

tzn usuwajac vector z programu wyniki mi dobre wypluwa

0

po pierwsze; nie zauwazylem ze czytasz po jednym bajcie.. w takim przypadku, POD WARUNKIEM ze masz wlasciwy do takiego czegos endianess procesora [patrz nizej, przypadek (A)] wsyzsktie liczby powinny byc 0..255 i rzeczywiscie nic nie powinno sie wypisac ujemne. jesli zas masz (B) - to wrecz przeciwnie, wszystkie liczby beda sie wypisywac jako wielkie, w polowie dodatnie, w polowie ujemne.

a teraz w szczegolach: w obecnym momencie masz 4-bajtowego int'a o nazwie 'bmpimg' do ktorego w kazdym obiegu petli wczytujesz JEDEN BAJT. w zaleznosci od ENDIANESS Twojego procka, int po tym fakcie wyglada tak: 0x??????XX (A) albo 0xXX?????? (B), gdzie XX to swiezo odczytany bajt.

jako ze nie masz zainicjowanych nigdzie pozostalych bajtow tego int'a - sa w nich losowe smieci, stad pytajniki. w tym konkretnym przypadku, masz farta, poniewaz znalazly sie w nich zera. w przypadku gdy jeszcze bylo kilka innych zmiennych, pozycja 'bmpimg' na stosie sie zmienila i ta zmienna juz nie zaczela z wartoscia 0x00000000 tylko z faktycznymi smieciami ze starych fragmentow stosu.

sprobuj przed fread napisac bmpimg=0; i pewnie czy przywrocisz vector czy nie, wynik bedzie 'dobry'

0

dzieki :) juz wiem przynajmniej po co mnie na uP uczyli o Big i Litle Endians :) rozwiazanie bylo proste ale niestety za malo siedze jeszcze w programowaniu :) tak czy owak dzieki :))
// co prawda to juz odbiega troche od tematu ale:
musze obrocic obraz o jakis kat, zapisalem sobie cala tablice w vectorze ale nie wiem jakim algorytmem go ladnie poprzestawiac, chodzi o katy 90,180,270. Ma ktos jakis pomysl na algorytm?

0

podpowiedz:

obrot tablicy [W,H] o kat 90' to przepisanie pixeli do nowej tablicy [H,W], przyczym pixel [x, y] laduje na [H-y, x]

pozostale obmysl sam

1 użytkowników online, w tym zalogowanych: 0, gości: 1