Witam.
Piszę program, którego zadaniem będzie obróbka obrazów bmp. Jako, że nie jestem za mocny w C++, używam BC++B. Do otwarcia pliku wykorzystuję komponent OpenDialog (OpenPictureDialog), a do zapisu SavePictureDialog. Wczytany obraz wyświetlany jest w komponencie Image, a dodatkowo wpisywany w tablice. Następnie wykonywane są obliczenia na elementach tablicy. No i na zakończenie można zapisać obrobiony obraz do pliku.
Problem z jakim się borykam to błędy typu:
Występuję one w przypadku, gdy wczytam obraz, dokonam obróbki, po czym znowu próbuję wczytać obraz.
Oto kod źródłowy:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "TObraz.hpp"
#include "stdio.h"
#include "dos.h"
//#include "jpeg.hpp"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
TObraz *Obraz=new TObraz;
int Height_1, Width_1;
int typ_mod;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
Graphics::TBitmap *MyImage=new Graphics::TBitmap;
void __fastcall TForm1::Open1Click(TObject *Sender)
{
StaticText2->Visible=true;
StaticText2->Caption="Wczytuję obraz";
SpeedButtonOtworz->Enabled=false;
Open1->Enabled=false;
if (OpenDialog1->Execute())
{
SpeedButtonZapisz->Enabled=false;
Image1->Visible=true;
Image3->Visible=true;
MyImage->LoadFromFile(OpenDialog1->FileName);
Obraz->ImLoad(MyImage,'b');
Image1->Picture->Graphic->Height=MyImage->Height;
Image1->Picture->Graphic->Width=MyImage->Width;
Image3->Picture->Graphic->Height=MyImage->Height;
Image3->Picture->Graphic->Width=MyImage->Width;
Obraz->ImChange(Image1, ProgressBar1);
Obraz->ImChange(Image3, ProgressBar1);
Obraz->ImLoad(MyImage,'r');
Button1->Enabled=true;
SpeedButtonZapisz->Enabled=true;
Save1->Enabled=true;
ProgressBar1->Enabled=true;
Height_1=Image1->Picture->Graphic->Height;
Width_1=Image1->Picture->Graphic->Width;
Image3->Left=(Width_1+18);
ProgressBar1->Position=0;
WyborModyfikacji->Enabled=true;
}
StaticText2->Visible=false;
SpeedButtonOtworz->Enabled=true;
Open1->Enabled=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
StaticText2->Visible=true;
StaticText2->Caption="Filtruję";
SpeedButtonOtworz->Enabled=false;
SpeedButtonZapisz->Enabled=false;
Open1->Enabled=false;
Save1->Enabled=false;
int wk, koszt, ip, jp, rozm_maski, ok=1, h;
if(typ_mod==1 || typ_mod==2)
{
while(ok)
{
rozm_maski=StrToInt(InputBox("Filtracja","Podaj rozmiar maski >=5 <=13 (nieparzyste)","9"));
if ((rozm_maski%2) > 0 && rozm_maski>=5 && rozm_maski<=13) ok=0;
else (ShowMessage("Podałeś zły rozmiar maski"));
}
}
else
{
while(ok)
{
rozm_maski=StrToInt(InputBox("Filtracja","Podaj rozmiar maski >=3 <=13 (nieparzyste)","9"));
if ((rozm_maski%2) > 0 && rozm_maski>=3 && rozm_maski<=13) ok=0;
else (ShowMessage("Podałeś zły rozmiar maski"));
}
}
ok=1;
while(ok)
{
h=StrToInt(InputBox("Filtracja","Podaj wartość wpółczynnika h 1÷50","20"));
if (h > 0 && h < 51) ok=0;
else (ShowMessage("Podałeś złą wartość współczynnika h"));
}
double progress=(double)100/Width_1;
StaticText1->Visible=true;
for (ip=0; ip<Width_1; ip++ )
{
for (jp=0; jp<Height_1; jp++)
{
Image3->Canvas->Pixels[ip][jp]=Obraz->Filtr(h,ip,jp,Height_1,Width_1,rozm_maski,'K', typ_mod);
}
Application->ProcessMessages();
ProgressBar1->Position=ip*progress+1.5;
StaticText1->Caption=(IntToStr(ProgressBar1->Position) +"%");
Image3->Refresh();
}
StaticText2->Visible=false;
SpeedButtonOtworz->Enabled=true;
SpeedButtonZapisz->Enabled=true;
Open1->Enabled=true;
Save1->Enabled=true;
ProgressBar1->Position=0;
StaticText1->Visible=false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Exit1Click(TObject *Sender)
{
Application->Terminate();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Save1Click(TObject *Sender)
{
if (SavePictureDialog1->Execute())
Image3->Picture->SaveToFile(SavePictureDialog1->FileName);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SpeedButtonOtworzClick(TObject *Sender)
{
Open1->OnClick(Sender);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SpeedButtonZapiszClick(TObject *Sender)
{
Save1->OnClick(Sender);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::WyborModyfikacjiClick(TObject *Sender)
{
typ_mod=WyborModyfikacji->ItemIndex;
}
//---------------------------------------------------------------------------