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

TImage między dwoma formami

dział ogólny

TImage między dwoma formami

Nowy postprzez xredom » poniedziałek, 15 kwietnia 2013, 09:16

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. :|
Ostatnio edytowano poniedziałek, 15 kwietnia 2013, 09:52 przez xredom, łącznie edytowano 1 raz
Avatar użytkownika
xredom
Bladawiec
Bladawiec
 
Posty: 22
Dołączył(a): niedziela, 14 kwietnia 2013, 20:00
Podziękował : 12
Otrzymał podziękowań: 0
System operacyjny: windows 7
Kompilator: C++ Bulider 6
Gadu Gadu: 0
    Windows 7Chrome

Re: TImage między dwoma formami

Nowy postprzez Mironas » poniedziałek, 15 kwietnia 2013, 09:43

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
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: TImage między dwoma formami

Nowy postprzez Cyfrowy Baron » poniedziałek, 15 kwietnia 2013, 13:19

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
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: TImage między dwoma formami

Nowy postprzez Mironas » poniedziałek, 15 kwietnia 2013, 13:50

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.

Za ten post autor Mironas otrzymał podziękowanie od:
xredom
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: TImage między dwoma formami

Nowy postprzez Cyfrowy Baron » wtorek, 16 kwietnia 2013, 09:29

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 );
}

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
xredom
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: TImage między dwoma formami

Nowy postprzez xredom » środa, 17 kwietnia 2013, 09:47

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:
Avatar użytkownika
xredom
Bladawiec
Bladawiec
 
Posty: 22
Dołączył(a): niedziela, 14 kwietnia 2013, 20:00
Podziękował : 12
Otrzymał podziękowań: 0
System operacyjny: windows 7
Kompilator: C++ Bulider 6
Gadu Gadu: 0
    Windows 7Chrome


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 2 gości

cron