Program otwierajacy plik *.bmp i przepisujacy go do innego pliku *.bmp

Odpowiedz Nowy wątek
2012-12-01 14:36
0

Witam!
Mam do napisania programik który jak w temacie przepisuje bitmape z jednego pliku, tworzy nowy plik bmp i w nim zapisuje zawartosc odczytanej bitmapy. Program ma slużyc jako baza do programu nakladajacego rozne filtry na obrazy. Program napisalem ale podczas proby uruchomienia z nieznanych mi przyczyn program nie moze uzyskac dostepu do pliku ktory utworzyl i w ktorym ma zapisac odczytana bitmape. Ponizej zamieszczan kod:

 
#include <windows.h>
#include <math.h>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <fstream>
 
using namespace std;
 
BITMAPFILEHEADER bm_h;
BITMAPV5HEADER bm_v5;
RGBQUAD bm_rgb;
 
int main()
{
    ifstream fh ("C:\\Documents and Settings\\Admin\\Pulpit\\program\\aston.bmp", ifstream::in);
    ofstream fhout("C:\\Documents and Settings\\Admin\\Pulpit\\program\\aston_out.bmp", ios::binary);
    //fhout.open ("C:\\Documents and Settings\\Admin\\Pulpit\\program\\aston_out.bmp");
    fh.read((char *)(&bm_h),sizeof(bm_h));
    fh.read((char *)(&bm_v5),sizeof(bm_v5));
    fh.read((char *)(&bm_rgb),sizeof(bm_rgb));
    fh.close();
    cout<<"typ:"<<bm_h.bfType<<endl<<"rozmiar:"<<bm_h.bfSize<<endl;
    cout<<"szer.:"<<bm_v5.bV5Width<<endl<<"wys.:"<<bm_v5.bV5Height<<endl;
    cout<<"kolory:"<<bm_v5.bV5BitCount<<endl<<"kompresja:"<<bm_v5.bV5Compression<<endl;
    cout<<"blue:"<<(string *)(bm_rgb.rgbBlue)<<endl<<"green:"<<(string *)(bm_rgb.rgbGreen)<<endl<<"red:"<<(string *)(bm_rgb.rgbRed)<<endl;
    fh.seekg(bm_h.bfOffBits, ios::beg);
 
    char **bitmap = new char *[bm_v5.bV5Width];
    for (int x =0 ; x<bm_v5.bV5Width; x++){
        bitmap[x] = new char [bm_v5.bV5Height];
    }
 
    for (int h=0 ; h<bm_v5.bV5Height ; h++)
    {
        for (int w = 0 ; w<bm_v5.bV5Width ; w++)
        {
            fh.read((char *)(&bitmap[w][h]), 1 );
        }
    }
 
    //wyswietlenie tablicy na ekranie dla testu zawartosci
    /*
    for (int h=0 ; h<bm_v5.bV5Height ; h++)
    {
        for (int w = 0 ; w<bm_v5.bV5Width ; w++)
        {
            cout<<bitmap[w][h];
        }
    }
        ///////////////////////////////////
    */
    fhout.write((char *)(bm_h.bfType), sizeof(bm_h.bfType));
    fhout.write((char *)(bm_h.bfSize), sizeof(bm_h.bfSize));
    fhout.write((char *)(bm_h.bfReserved1), sizeof(bm_h.bfReserved1));
    fhout.write((char *)(bm_h.bfReserved2), sizeof(bm_h.bfReserved2));
    fhout.write((char *)(bm_h.bfOffBits), sizeof(bm_h.bfOffBits));
    fhout.write((char *)(bm_v5.bV5Size), sizeof(bm_v5.bV5Size));
    fhout.write((char *)(bm_v5.bV5Width), sizeof(bm_v5.bV5Width));
    fhout.write((char *)(bm_v5.bV5Height), sizeof(bm_v5.bV5Height));
    fhout.write((char *)(bm_v5.bV5Planes), sizeof(bm_v5.bV5Planes));
    fhout.write((char *)(bm_v5.bV5BitCount), sizeof(bm_v5.bV5BitCount));
    fhout.write((char *)(bm_v5.bV5Compression), sizeof(bm_v5.bV5Compression));
    fhout.write((char *)(bm_v5.bV5SizeImage), sizeof(bm_v5.bV5SizeImage));
    fhout.write((char *)(bm_v5.bV5XPelsPerMeter), sizeof(bm_v5.bV5XPelsPerMeter));
    fhout.write((char *)(bm_v5.bV5YPelsPerMeter), sizeof(bm_v5.bV5YPelsPerMeter));
    fhout.write((char *)(bm_v5.bV5ClrUsed), sizeof(bm_v5.bV5ClrUsed));
    fhout.write((char *)(bm_v5.bV5ClrImportant), sizeof(bm_v5.bV5ClrImportant));
    fhout.write((char *)(bm_v5.bV5RedMask), sizeof(bm_v5.bV5RedMask));
    fhout.write((char *)(bm_v5.bV5GreenMask), sizeof(bm_v5.bV5GreenMask));
    fhout.write((char *)(bm_v5.bV5BlueMask), sizeof(bm_v5.bV5BlueMask));
    fhout.write((char *)(bm_v5.bV5AlphaMask), sizeof(bm_v5.bV5AlphaMask));
    fhout.write((char *)(bm_v5.bV5CSType), sizeof(bm_v5.bV5CSType));
    //fhout.write((CIEXYZTRIPLE )(bm_v5.bV5Endpoints), sizeof(bm_v5.bV5Endpoints));
    fhout.write((char *)(bm_v5.bV5GammaRed), sizeof(bm_v5.bV5GammaRed));
    fhout.write((char *)(bm_v5.bV5GammaGreen), sizeof(bm_v5.bV5GammaGreen));
    fhout.write((char *)(bm_v5.bV5GammaBlue), sizeof(bm_v5.bV5GammaBlue));
    fhout.write((char *)(bm_v5.bV5Intent), sizeof(bm_v5.bV5Intent));
    fhout.write((char *)(bm_v5.bV5ProfileData), sizeof(bm_v5.bV5ProfileData));
    fhout.write((char *)(bm_v5.bV5ProfileSize), sizeof(bm_v5.bV5ProfileSize));
    fhout.write((char *)(bm_v5.bV5Reserved), sizeof(bm_v5.bV5Reserved));
    fhout.write((char *)(bm_rgb.rgbBlue), sizeof(bm_rgb.rgbBlue));
    fhout.write((char *)(bm_rgb.rgbGreen), sizeof(bm_rgb.rgbGreen));
    fhout.write((char *)(bm_rgb.rgbRed), sizeof(bm_rgb.rgbRed));
    fhout.write((char *)(bm_rgb.rgbReserved), sizeof(bm_rgb.rgbReserved));
    for (int h=0 ; h<bm_v5.bV5Height ; h++)
    {
        for (int w = 0 ; w<bm_v5.bV5Width ; w++)
        {
            fhout.write((char *)(bitmap[w][h]), 1);
        }
    }
 
    for (int x=0 ;  x<bm_v5.bV5Width ; x++)
    {
        delete [] bitmap[x];
        delete [] bitmap;
    }
 
    fh.close();
    fhout.close();
    system("PAUSE");
    return 0;
}

Pozostało 580 znaków

2012-12-01 15:02
0

Prawa zapisu ustawiane dla folderu w windows.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2012-12-01 15:12
0

odhaczylem we wlasciwosciach folderu opcje tylko do odczytu ale nadal wyskakuje blad. Jeszcze gdzies musze cos ustawic? A tak poza tym czy pod katem takim skladniowym to program jest poprawny i powienien dzialac po usunieciu tego bledu z dostepem?

Pozostało 580 znaków

2012-12-01 15:18
0
TomekOSW napisał(a):

odhaczylem we wlasciwosciach folderu opcje tylko do odczytu ale nadal wyskakuje blad. Jeszcze gdzies musze cos ustawic? A tak poza tym czy pod katem takim skladniowym to program jest poprawny i powienien dzialac po usunieciu tego bledu z dostepem?

  • podaj dokładny komunikat
  • przetestuj z "krótką" ścieżką - np: "c:\temp"
  • fh.seekg wykonywane jest na zamkniętym pliku, tak można?
edytowany 1x, ostatnio: vpiotr, 2012-12-01 15:19

Pozostało 580 znaków

2012-12-01 15:25
0

Blad wyskakuje juz w trakcie dzialania programu i brzmi on tak:

"An unhandled exception of type 'System.AccessViolationException' occurred in bitmap.exe

Additional information: Nastąpiła próba odczytu lub zapisu pamięci chronionej. Często wskazuje to, że inna pamięć jest uszkodzona."

sciezke zmienilem na c:\temp\ ale nadal wyskakuje blad, ogolnie to program anwet tworzy sobie ten plik wyjsciowy ale nie potrafi do niego zapisac danych, a problem z fh.seekg juz naprawilem nie zauwazylem ze zamknalem tam tan plik . Ogolnie program nadal nie dziala

Pozostało 580 znaków

2012-12-01 15:31
1
TomekOSW napisał(a):

Blad wyskakuje juz w trakcie dzialania programu i brzmi on tak:

"An unhandled exception of type 'System.AccessViolationException' occurred in bitmap.exe

Z tego wynika że masz błąd dostępu do pamięci, a to prowadzi do:

fhout.write((char *)(bm_h.bfType), sizeof(bm_h.bfType));

Które lepiej żeby było zapisane tak:

fhout.write((char *)(&bm_h.bfType), sizeof(bm_h.bfType));

(oczywiście dla prawie każdej zapisywanej linijki - oprócz pól char[]))

edytowany 1x, ostatnio: vpiotr, 2012-12-01 15:32

Pozostało 580 znaków

2012-12-01 15:33
1
TomekOSW napisał(a):

"An unhandled exception of type 'System.AccessViolationException' occurred in bitmap.exe
To z całą pewnością oznacza że : - "program nie moze uzyskac dostepu do pliku który utworzył" !!
Mażesz po pamięci i tyle.

Czemu nie zrobić zapis po ludzku?

        fhout.write((char *)(&bm_h),sizeof(bm_h));
        fhout.write((char *)(&bm_v5),sizeof(bm_v5));
        fhout.write((char *)(&bm_rgb),sizeof(bm_rgb));

Po kiego ci dwuwymiarowa tablica?

        size_t bitmapsize=bm_v5.bV5Width*bm_v5.bV5Height;
        char *bitmap = new char [bitmapsize];
        fh.read(bitmap,bitmapsize);

Jeżeli już robisz tą dwuwymiarową to:
delete [] bitmap; - ma się wykonać tylko raz a nie w pętli jak u ciebie.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 3x, ostatnio: _13th_Dragon, 2012-12-01 15:44

Pozostało 580 znaków

2012-12-01 16:50
0

Ok wszystko poprawilem teraz smiga jak trzeba dzieki wam za pomoc a tablice zostawiam dwuwymiarowa bo ten program bedzie wykorzystywany do obslugi roznych filtrow gdzie bede musial operowac na tablicy.

takie jeszcze tylko szybkie pytanko nie wiem tylko czemu ten plik ktory mi utworzyl ma takie same wymiary ale kiedy probuje go otworzyc to otwiera sie tylko przegladarka z napisem "rysowanie nie powiodlo sie" a jesli otwore w paincie to mam biale tlo z poprawnymi wymiarami ?

czy problemem moze byc tutaj fakt ze nie przepisuje absolutnie wszystkich naglowkow z pliku zrodlowego (jak wyczytalem w msdn jest ich tam jeszcze kilka wiecej) ?

edytowany 1x, ostatnio: TomekOSW, 2012-12-01 17:03

Pozostało 580 znaków

2012-12-01 17:03
0

Porównaj pliki za pomocą fc /B
Szklana kula w naprawie, więc nie wiem jak wygląda twój obecny kod, na pewno coś źle zapisujesz.
Co widzę na pewno: to nie sprawdzasz rozmiar pixela
Co do jednowymiarowej tablicy zamiast dwuwymiarowej:
zamiast: bitmap[y][x];
będziesz używać: bitmap[y*bm_v5.bV5Width+x];


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2012-12-01 17:05
0

ok to bede sobie juz nad tym myslal na zajeciach dzieki jeszcze raz za pomoc

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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