Zoom w TImage

problemy z tworzeniem aplikacji graficznych oraz audio i wideo

Zoom w TImage

Nowy postprzez apancerz » poniedziaÅ‚ek, 26 października 2009, 17:49

Witam

Mam taki problem, chce zrobić zoom zaznaczonego obszaru myszka w Timage tak aby mi ten obszar wczytało do calego obiektu Image lub druga opcja wczytywanie inych obrazów o mniejszej skali z terenu zaznaczonego myszką. I nie mam pojęcia jak się do tego zabrać. Jestem początkujący w programowaniu grafiki.

Z góry dzięki wszystkim za pomoc!!!
Avatar użytkownika
apancerz
Bladawiec
Bladawiec
 
Posty: 2
Dołączył(a): poniedziałek, 26 października 2009, 17:36
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: Zoom w Borland c++

Nowy postprzez Cyfrowy Baron » poniedziaÅ‚ek, 26 października 2009, 18:19

Skoro jesteś początkujący, to na początek przerób poradę: dział: porady -> grafika -> Tworzenie funkcji ZOOM dla obiektów typu TImage i TBitmap. Cyfrowy Baron. Gdy już zrozumiesz mechanizm, będzie Tobie łatwiej przerobić kod do własnych potrzeb.
Nigdy czegoś podobnego nie robiłem, ale mam pewna koncepcję, którą sprawdzę w wolnej chwili, jednak nie dziś i nie jutro...
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
    NieznanyNieznana

Re: Zoom w Borland c++

Nowy postprzez Koziol » wtorek, 27 października 2009, 01:25

Na mój gust można skorzystać z OnMouseDown i OnMouseUp

Obejrzyj ten kod z helpa:
Kod: Zaznacz cały
int StartX, StartY; // Declare at the top of the form’s unit

// Use this code as the OnMouseDown event handler of the form:

void __fastcall TForm1::Button1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
{
  StartX = X;
  StartY = Y;

}

// Use this code as the OnMouseUp event handler of the form:

void __fastcall TForm1::FormMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
{
  Form1->Canvas->Rectangle(StartX, StartY, X, Y);
  StatusBar1->Panels->Items[0]->Text = "";
  StatusBar1->Panels->Items[1]->Text = "";
  StatusBar1->Panels->Items[2]->Text = "";
  StatusBar1->Panels->Items[3]->Text = "";

}

// Use this code as the OnMouseMove event handler of the form:

void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift, int X, int Y)
{
  if (Shift.Contains(ssLeft)) // make sure button is down
  {
    if (Y > StartY)
    {
      StatusBar1->Panels->Items[0]->Text = "Top: " + IntToStr(StartY);
      StatusBar1->Panels->Items[2]->Text = "Bottom: " + IntToStr(Y);
    }
    else
    {
      StatusBar1->Panels->Items[0]->Text = "Top: " + IntToStr(Y);

      StatusBar1->Panels->Items[2]->Text = "Bottom: " + IntToStr(StartY);
    }
    if (X > StartX)
    {
      StatusBar1->Panels->Items[1]->Text = "Left: " + IntToStr(StartX);
      StatusBar1->Panels->Items[3]->Text = "Right: " + IntToStr(X);
    }
    else
    {
      StatusBar1->Panels->Items[1]->Text = "Left: " + IntToStr(X);
      StatusBar1->Panels->Items[3]->Text = "Right: " + IntToStr(StartX);
    }
  }
}

Tworzy on kółko na obiekcie TImage łącząc go z poradą CyfrowegoBarona (patrz post wyżej) uzyskasz ten efekt ;)
Ostatnio edytowano wtorek, 27 października 2009, 08:29 przez Cyfrowy Baron, łącznie edytowano 1 raz
Powód: ZMieniono bbCode z quote na code, by kod był czytelniejszy
Avatar użytkownika
Koziol
Intelektryk
Intelektryk
 
Posty: 144
Dołączył(a): niedziela, 13 lipca 2008, 17:36
PodziÄ™kowaÅ‚ : 8
OtrzymaÅ‚ podziÄ™kowaÅ„: 2
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder
    NieznanyNieznana

Re: Zoom w Borland c++

Nowy postprzez Cyfrowy Baron » wtorek, 27 października 2009, 08:37

Podany kod narysuje na formularzu po prostu prostokÄ…t.
Chyba chodziło tobie o rysowanie tzw. metodą Rubber-banding. Opis tej metodą znajduje się w wątku: Zaznaczenie na Canvasie

Ale w ten sposób dodajemy tylko efekt graficzny rysowania zaznaczenia na obiekcie. Powiększenia z tego się nie uzyska, o ile nie doda się jeszcze kodu kopiującego tylko zaznaczony fragment i przerysowującego grafikę. Wymagałoby to oczywiście bufora przechowującego Bitmapę, gdyż Canvas obsługuje tylko bitmapy. Można by postąpić inaczej i ustawić obiekt Image tak by rozciągał grafikę (właściwość Stretch) i powiększać cały Image z wyśrodkowaniem go na zaznaczonym fragmencie.
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
    NieznanyNieznana

Re: Zoom w Borland c++

Nowy postprzez Koziol » wtorek, 27 października 2009, 10:11

Cyfrowy Baron napisał(a):Podany kod narysuje na formularzu po prostu prostokąt.


Angielskie słówka po nocy już się pętlą w główie (ale gafa :roll: )

Kożystając z:

void __fastcall TForm1::Button1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
void __fastcall TForm1::FormMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)

Można pobrać współrzędne (X i Y) dla początku i końca obszaru zaznaczenia i powiększyć (podstawiając w odpowiedni sposób do porady o Zoom'ie) no chyba że jest tam zastosowany jakiś kruczek którego na szybko nie zauważyłem.
Avatar użytkownika
Koziol
Intelektryk
Intelektryk
 
Posty: 144
Dołączył(a): niedziela, 13 lipca 2008, 17:36
PodziÄ™kowaÅ‚ : 8
OtrzymaÅ‚ podziÄ™kowaÅ„: 2
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder
    NieznanyNieznana

Re: Zoom w Borland c++

Nowy postprzez Cyfrowy Baron » wtorek, 27 października 2009, 10:25

Co do pobierania współrzędnych wszystko się zgadza, ale to wymaga jeszcze kodu, który przetworzy te zmienne i odpowiednio powiększy obrazek, same współrzędne nie wystarczą, a z kodu który podałeś:

Kod: Zaznacz cały
Form1->Canvas->Rectangle(StartX, StartY, X, Y);


Ta funkcja tylko narysuje prostokÄ…t na formularzu.
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
    NieznanyNieznana

Re: Zoom w Borland c++

Nowy postprzez apancerz » Å›roda, 28 października 2009, 13:25

Próbowałem wykorzystać wasze porady, jednak muszę powiedzieć, że powziąłem próbe zrobienia dość trudnej rzeczy. Na razie mi się nie udało ale się nie pddaje i prubuje dalej!!!. Mile widzę kolejne wskazówki
Avatar użytkownika
apancerz
Bladawiec
Bladawiec
 
Posty: 2
Dołączył(a): poniedziałek, 26 października 2009, 17:36
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: Zoom w TImage

Nowy postprzez Cyfrowy Baron » Å›roda, 28 października 2009, 17:20

Podaję przykładowy kod wymagający oczywiście dopracowania. Zmienia rozmiar zaznaczenia, ale tylko raz, nie przesuwa Image względem powiększenia, no i można zastosować powiększenie tylko raz. Poza tym możesz pracować tylko na bitmapach, podany kod wykorzystuje konwersję, wiec jeżeli umieścisz w Image plik w formacie JPEG, to zostanie przekonwertowany na bitmapę.

Plik nagłówkowy np. Unit1.h:
Kod: Zaznacz cały
private:   // User declarations
    bool FDrawing;
    bool FFirstRect;
    TPoint F1, F2;
    void __fastcall DrawRect(TCanvas *MyCanvas, TPoint f1, TPoint f2);
    void __fastcall ZoomImage(TImage *Image, TPoint f1, TPoint f2);

    int imgW, imgH;
    Graphics::TBitmap *tmpBmp;


Plik źródłowy np. Unit1.cpp:
Kod: Zaznacz cały
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
FDrawing = false;

imgW = Image1->Picture->Graphic->Width;
imgH = Image1->Picture->Graphic->Height;

// Tutaj dokonywana jest konwersja zawartosći Image1 do formatu BMP
tmpBmp = new Graphics::TBitmap();
tmpBmp->Width = imgW;
tmpBmp->Height = imgH;
tmpBmp->Assign((TPersistent*)Image1->Picture->Graphic);
tmpBmp->PixelFormat = pf24bit;

Image1->Picture->Bitmap->Assign(tmpBmp);

// koniec konwersji
}
//---------------------------------------------------------------------------
// Rubber-Banding
void __fastcall TForm1::DrawRect(TCanvas *MyCanvas, TPoint f1, TPoint f2)
{
MyCanvas->Brush->Style = bsClear;
MyCanvas->Pen->Style = psDash;
MyCanvas->Rectangle(f1.x, f1.y, f2.x, f2.y);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseDown(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
{
Image1->Width = imgW;
Image1->Height = imgH;
Image1->Picture->Bitmap->Assign(tmpBmp);
Application->ProcessMessages();
F1.x = X;
F1.y = Y;
FFirstRect = true;
FDrawing = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift,
      int X, int Y)
{
if(FDrawing == true)
{
  Image1->Canvas->Pen->Mode = pmNotXor;

  if(FFirstRect == false) DrawRect(Image1->Canvas, F1, F2);

  F2.x = X;
  F2.y = Y;
  FFirstRect = false;
  DrawRect(Image1->Canvas, F1, F2);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseUp(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
{
F2.x = X;
F2.y = Y;
FDrawing = false;
DrawRect(Image1->Canvas, F1, F2);
Image1->Canvas->Pen->Mode = pmCopy;

ZoomImage(Image1, F1, F2);
}
//---------------------------------------------------------------------------
// ZOOM
void __fastcall TForm1::ZoomImage(TImage *Image, TPoint f1, TPoint f2)
{
float rectWidth  = f2.x - f1.x;
float rectHeight = f2.y - f1.y;

if(rectWidth > rectHeight)
{
  float ratio = ((float)imgW / rectWidth);
  Image->Width = ratio * (float)imgW;

  float proporcje = (float)imgW / (float)imgH;
  float iHeight = (float)Image->Width / proporcje;

  Image->Height = iHeight;

  TRect rRect = Rect(0, 0, Image->Width, Image->Height);

  Graphics::TBitmap *fBmp = new Graphics::TBitmap();
  fBmp->Width  = Image->Width;
  fBmp->Height = Image->Height;

  fBmp->Canvas->StretchDraw(rRect, tmpBmp);

  Image->Picture->Bitmap->Assign(fBmp);

  delete fBmp;
}
else
{
  float ratio = ((float)imgH / rectHeight);
  Image->Height = ratio * (float)imgH;

  float proporcje = (float)imgH / (float)imgW;
  float iWidth = (float)Image->Height / proporcje;

  Image->Width = iWidth;

  TRect rRect = Rect(0, 0, Image->Width, Image->Height);

  Graphics::TBitmap *fBmp = new Graphics::TBitmap();
  fBmp->Width  = Image->Width;
  fBmp->Height = Image->Height;

  fBmp->Canvas->StretchDraw(rRect, tmpBmp);

  Image->Picture->Bitmap->Assign(fBmp);

  delete fBmp;
}
}
//---------------------------------------------------------------------------


Nie chce mi się więcej nad tym myśleć wiec reszta należy do Ciebie.
W załączniku przykładowy program.
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
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
    NieznanyNieznana


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Aplikacje multimedialne, graficzne

Kto przeglÄ…da forum

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

cron