CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - TImage między dwoma formami
Strona 1 z 1

TImage między dwoma formami

PostNapisane: poniedziałek, 15 kwietnia 2013, 09:16
przez xredom
Witam ponownie tym razem mam problem gdyż próbuje zrobić rozjaśnianie czy też kontrast i problem w tym że forma 2 pobiera obraz z formy 1 do dwóch komponentów Image 1 oryginał, Image 2 po zmianie no i próbuje coś zrobić w tym stylu http://programowanie.cal.pl/cyfbar/grafika.html#graf17 z tym że po przesuwaniu TrackBar bitmapa ani się nie zmienia w image2, ani się też nie odświeża(pewnie w tym tkwi problem) mało tego po przesuwaniu scorlbara wyparowuje obrazek. Hmm w algorytmie na podanej wyżej stronie jest też wczytanie pliku i konwersja do bitmapy u mnie w formie1 wygląda to tak:
KOD cpp:     UKRYJ  
void __fastcall TMainForm::BitBtn1Click(TObject *Sender)
{
if(OpenPictureDialog1->Execute())
 {
Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName);

  try
  {
   BMP->LoadFromFile(OpenPictureDialog1->FileName);
   BMP->PixelFormat = pf32bit;
  }
  catch(...)
  {
   TJPEGImage *jpg = new TJPEGImage();
   jpg->LoadFromFile(OpenPictureDialog1->FileName);

   BMP->Width = jpg->Width;
   BMP->Height = jpg->Height;

   BMP->Canvas->Draw(0, 0, jpg);
   BMP->PixelFormat = pf32bit;
   jpg->Free();
  }
  }
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::OnShowFormatkiNumerDwa(TObject *Sender) {

   Form2->Image->Picture->Assign(Image1->Picture);
   Form2->Image2->Picture->Assign(Image1->Picture);

}
//---------------------------------------------------------------------------
void __fastcall TMainForm::FormCreate(TObject *Sender)
{
        DoubleBuffered = true;
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::BitBtn3Click(TObject *Sender)
{
   Form2->Image->Picture->Assign(Image1->Picture);
   Form2->Image2->Picture->Assign(Image1->Picture);
   Form2->ShowModal();
}
//---------------------------------------------------------------------------
 

być może nie kopiuje mi czegoś z formy1 image do formy2 image2?
w formie2 umieściłem:
KOD cpp:     UKRYJ  
// Plik źródłowy np. Unit2.cpp
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
        : TForm(Owner)
{
 BMP = new Graphics::TBitmap();
}
//---------------------------------------------------------------------------
void __fastcall Brightness(Graphics::TBitmap *BMP, int x)
{
 for(int i = 0; i < BMP->Height; i++)
 {
  RGBQUAD *row = (RGBQUAD *) BMP->ScanLine[i];

  for(int j = 0; j < BMP->Width; j++)
  {
   int b = row[j].rgbBlue;
   int g = row[j].rgbGreen;
   int r = row[j].rgbRed;

   r += x;
   g += x;
   b += x;

   b = (b > 255) ?255: (b < 0) ?0:b;
   g = (g > 255) ?255: (g < 0) ?0:g;
   r = (r > 255) ?255: (r < 0) ?0:r;

   row[j].rgbBlue  = (BYTE) b;
   row[j].rgbGreen = (BYTE) g;
   row[j].rgbRed   = (BYTE) r;
  }
 }
}
//---------------------------------------------------------------------------
void __fastcall TForm2::TrackBar1Change(TObject *Sender)
{
 TMemoryStream *Ms = new TMemoryStream;
 Ms->Position = 0;
 BMP->SaveToStream(Ms);
 Ms->Position = 0;
 Image2->Picture->Bitmap->LoadFromStream(Ms);
 delete Ms;

 Brightness(Image2->Picture->Bitmap, TrackBar1->Position);
}
//---------------------------------------------------------------------------
// Plik źródłowy np. Unit2.h
//---------------------------------------------------------------------------
private:
        Graphics::TBitmap *BMP;
//---------------------------------------------------------------------------

Z góry dziękuje za pomoc. :|

Re: TImage między dwoma formami

PostNapisane: poniedziałek, 15 kwietnia 2013, 09:43
przez Mironas
W metodzie 'TrackBar1Change' zanim wywołujesz funkcję Brightness(...) wczytujesz do Image2 pustą bitmapę:
KOD cpp:     UKRYJ  
TMemoryStream *Ms = new TMemoryStream;
Ms->Position = 0;
BMP->SaveToStream(Ms);
Ms->Position = 0;
Image2->Picture->Bitmap->LoadFromStream(Ms);
delete Ms;
 


Po co?

PS:
Fragmenty kodu umieszczaj w znacznikach CPP

Re: TImage między dwoma formami

PostNapisane: poniedziałek, 15 kwietnia 2013, 13:19
przez Cyfrowy Baron
Mironas napisał(a):wczytujesz do Image2 pustą bitmapę:


Przyjrzyj się dokładnie kodowi z porady a zobaczysz że obiekt BMP nie jest pusty. Tutaj zresztą też nie gdyż jest wypełniany w zdarzeniu BitBtn1Click d formularza MainForm. Kod nie działa, gdyż część danych jest przetwarzana na MainForm, a część na Form2.
xredom nie widzi różnicy między BMP na MainForm a BMP na Form2. O ile na MainForm BMP jest wypełniany, o tyle druga bitmapa BMP na Form2 jest pusta.

Prośba do xredom : nie przepisuj kodu bezmyślnie. Zauważ, że masz dwie bitmapy BMP jedną na MainForm i jedną na Form2, ale nie ma między nimi komunikacji i to nie jest jeden obiekt lecz dwa różne. Czy wiesz jak się przekazuje obiekty między formularzami? Jeżeli nie to zapoznaj się z tą poradą: http://programowanie.cal.pl/cyfbar/teor9.htm

Re: TImage między dwoma formami

PostNapisane: poniedziałek, 15 kwietnia 2013, 13:50
przez Mironas
Cyfrowy Baron napisał(a):obiekt BMP nie jest pusty


Obiekt BMP z Form2 jest pusty. Plik graficzny jest wczytany do BMP z formy głównej.
No chyba, że BMP to obiekt globalny (wspólny dla MainForm i Form2), ale tego nie wiemy bo xredom nie podał jak i gdzie go deklaruje.

Re: TImage między dwoma formami

PostNapisane: wtorek, 16 kwietnia 2013, 09:29
przez Cyfrowy Baron
Mironas napisał(a):Obiekt BMP z Form2 jest pusty. Plik graficzny jest wczytany do BMP z formy głównej.


Dokładnie tak jest jak piszesz! Chciałem tylko zwrócić uwagę, że w mojej poradzie obiekt nie jest pusty:

Cyfrowy Baron napisał(a): kodowi z porady a zobaczysz że obiekt BMP nie jest pusty.




Tam trzeba zrezygnować z jednego obiektu BMP i to tego z MainForm, gdyż przetwarzanie grafiki odbywa się na Form2, a wczytanie grafiki do BMP powinno się odbywać w tym samym momencie co wczytanie grafiki do obiektów Image na Form2.
Kod z MainForm wczytujący grafikę do BMP na niewiele się zda, gdyż w tym kodzie obrazek jest wczytywany z dysku a nie pobierany z Image. Poza tym zachodzi tam konwersja - jeśli jest potrzebna formatu JPEG na bitmapę.

Przede wszystkim na Form2 obiekt BMP należy zadeklarować w sekcji public a nie private, żeby był do niego dostęp z MainForm. Całą konwersję można przeprowadzić też dużo prościej.
Na MainForm jest funkcja OnShowFormatkiNumerDwa, która nigdzie nie jest użyta. Po co więc ta funkcja?

Poprawiony kod dla MainForm przy założeniu, że obiekt BMP jest tworzony tylko dla Form2 z deklaracją w sekcji public pliku nagłówkowego:

KOD cpp:     UKRYJ  
void __fastcall TMainForm::OnShowFormatkiNumerDwa(TObject *Sender)
{
 Form2->BMP->Assign( Image1->Picture->Graphic );
 Form2->BMP->PixelFormat = pf32bit;

 Form2->Image->Picture->Assign( BMP ); // <- !!!
 Form2->Image2->Picture->Assign( BMP );  // <- !!!
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::BitBtn3Click(TObject *Sender)
{
  Form2->BMP->Assign( Image1->Picture->Graphic );
  Form2->BMP->PixelFormat = pf32bit;

  Form2->Image->Picture->Assign( BMP );  // <- !!!
  Form2->Image2->Picture->Assign( BMP );  // <- !!!

 Form2->ShowModal();
}


Zdarzenie BitBtn1Click z MainForm należy usunąć, gdyż niczemu nie służy!



Kod w zdarzeniu TrackBar1Change dla Form2 też jest przekombinowany... Nie rozumiem jak mogłem stworzyć tego potworka?! :? Wystarcz tak:

KOD cpp:     UKRYJ  
void __fastcall TForm2::TrackBar1Change(TObject *Sender)
{
 Image2->Picture->Assign( BMP );

 Brightness( Image2->Picture->Bitmap, TrackBar1->Position );
}

Re: TImage między dwoma formami

PostNapisane: środa, 17 kwietnia 2013, 09:47
przez xredom
Ok dzięki za pomoc, trochę namieszałem z nazwami i przez to miałem więcej problemów, no ale dzięki waszej pomocy zrobiłem wszystko od nowa z waszymi wskazówkami i chodzi :) Oczywiście mieliście w 100% racje bo BMP było deklarowane w formie 1 potem w 2 zacząłem mieszać później zapoznałem się z http://programowanie.cal.pl/cyfbar/teor9.htm to próbowałem z formy1 przekazywać BMP do formy2 no i ostatecznie Cyfrowy Baron napisał sam kod który chodzi bez zarzutów :) Orłem w programowaniu nie jestem :( więc proszę o wybaczenie że tu co chwila zalewam was jakimiś głupimi pytaniami :roll: