CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Drukowanie TImage

Drukowanie TImage

problemy z tworzeniem aplikacji graficznych oraz audio i wideo

Drukowanie TImage

Nowy postprzez Frytek18 » czwartek, 17 maja 2012, 19:11

mam otoż problem z drukowaniem
KOD cpp:     UKRYJ  
Printer()->Orientation = poLandscape;

Printer()->BeginDoc();

int x = Printer()->PageWidth; // długość strony.
int y = Printer()->PageHeight; // wysokość strony.

int width;
int height;

if((x / Image->Width) < (y / Image->Height))
{
  width = Image->Width * ((x / Image->Width) + 0.5);
  height = Image->Height * ((x / Image->Width) + 0.5);
}
else
{
  height = Image->Height * ((y / Image->Height) + 0.5);
  width = Image->Width * ((y / Image->Height) + 0.5);
}

Printer()->Canvas->CopyRect(Rect(10, 10, width, height), Image->Canvas, Rect(0, 0, Image->Width, Image->Height));

Printer()->EndDoc();

i otoż drukuje mi tylko wtedy kiedy załaduje plik bmp do TImage a ja chce po otworzeniu programu była możliwość drukowanie tego co namaluje nie wiem juz chyba 10 sposobów próbowałem
Avatar użytkownika
Frytek18
Homos antropiczny
Homos antropiczny
 
Posty: 60
Dołączył(a): czwartek, 17 maja 2012, 19:05
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: WIN XP 32 bit
Kompilator: Embarcadero RAD Studio 2010 C++
Gadu Gadu: 5032466
    Windows XPFirefox

Re: Drukowanie TImage

Nowy postprzez Cyfrowy Baron » czwartek, 17 maja 2012, 23:01

Pokaż jakiś przykład rysowania. Czy rysujesz po Image1->Canvas, czy po Image1->Picture->Bitmap->Canvas?
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: Drukowanie TImage

Nowy postprzez Frytek18 » niedziela, 20 maja 2012, 10:42

Po Image->Canvas
Avatar użytkownika
Frytek18
Homos antropiczny
Homos antropiczny
 
Posty: 60
Dołączył(a): czwartek, 17 maja 2012, 19:05
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: WIN XP 32 bit
Kompilator: Embarcadero RAD Studio 2010 C++
Gadu Gadu: 5032466
    Windows XPFirefox

Re: Drukowanie TImage

Nowy postprzez Cyfrowy Baron » niedziela, 20 maja 2012, 11:50

U mnie Twoja funkcja działa bez zarzutu. Rysuję prostokąt na Image:

KOD cpp:     UKRYJ  
 Image->Canvas->Rectangle(10, 10, 300, 300);


A potem używam Twojego kodu bez żadnych modyfikacji i rysunek się pojawia. Gdy załaduję do Image np. bitmapę a potem narysuję na nim cokolwiek to wszystko się wydrukuje. Nie rozumiem więc w czym masz problem. Może chodzi Tobie o to, że jeżeli do Image załadujesz grafikę w formacie innym niż bitmapa to nie możesz po niej rysować?! To naturalne, gdyż image domyślnie obsługuje tylko bitmapy, inne formaty wymagają innych bibliotek, które wykorzystują Image jako powierzchnię do odrysowywania grafiki i nie obsługują TCanvas, więc nie można po nich rysować. W takiej sytuacji jedyne co możesz zrobić to przed odrysowywaniem czegokolwiek na Image zawierającym np. grafikę w formacie JPEG, musisz dokonać konwersji na bitmapę:

KOD cpp:     UKRYJ  
#include <memory>

//---------------------------------------------------------------------------
void ConvertToBmp(TImage *bImage)
{
 std::auto_ptr<TJPEGImage> Jpeg(new TJPEGImage());
 Jpeg->Assign( bImage->Picture->Graphic );

 std::auto_ptr<Graphics::TBitmap> bmp(new Graphics::TBitmap());

 bmp->Width = Jpeg->Width;
 bmp->Height = Jpeg->Height;

 bmp->Canvas->Draw(0, 0, Jpeg.release());  //przerysowanie grafiki w formacie jpg do obiektu bmp.

 bImage->Picture->Bitmap = bmp.release();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
 ConvertToBmp(Image);

 Image->Canvas->Rectangle(10, 10, 100, 100);
}
//---------------------------------------------------------------------------
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: Drukowanie TImage

Nowy postprzez Frytek18 » poniedziałek, 21 maja 2012, 20:18

W taki razie problem polega na tym ze gdy wczytam bmp to moge drukowac ale jak odrazu odpale program to nie i nie wiem jak to teraz zrobic
Avatar użytkownika
Frytek18
Homos antropiczny
Homos antropiczny
 
Posty: 60
Dołączył(a): czwartek, 17 maja 2012, 19:05
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: WIN XP 32 bit
Kompilator: Embarcadero RAD Studio 2010 C++
Gadu Gadu: 5032466
    Windows XPFirefox

Re: Drukowanie TImage

Nowy postprzez Cyfrowy Baron » poniedziałek, 21 maja 2012, 22:27

Frytek18 napisał(a):ale jak odrazu odpale program


Tego chyba nie rozumiem. Jak od razu po odpaleniu programu? W sumie nie ma znaczenia czy Image zawiera bitmapę czy nie i tak można drukować jej zawartość. Może pokaż cały kod.
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: Drukowanie TImage

Nowy postprzez Frytek18 » wtorek, 22 maja 2012, 18:22

Kod: Zaznacz cały
//---------------------------------------------------------------------------

#include <vcl.h>
#include <memory>
#pragma hdrstop

#include <Clipbrd.hpp>
#include <math.h>
#include "Unit1.h"
#include "Unit2.h"
#include "Unit3.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "CGRID"
#pragma resource "*.dfm"
TForm1 *Form1;
bool rysuj = false;         // zmienna sterujaca rysowaniem
int narzedzie = 1;          // numer narzędzia (domyslnie - olowek)
int  Xs, Ys;                // wspolrzedne sprayowania
TColor tab[680][450];       // tablica kolorów
AnsiString AktualnyPlik; // do operacji na pliku
void TForm1::Prostokat(void)       //Do kwaratu procedura
{
Image->Canvas->Pen->Width = suwak->Position;
Image->Canvas->Brush->Style = bsClear;
Image->Canvas->Pen->Style = bsDiagCross;

Image->Canvas->Rectangle(prost_s.x, prost_s.y, prost_k.x, prost_k.y);
}

Kod: Zaznacz cały
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
   DoubleBuffered = true;                       // likwidacja mrugania
   fgColor->Brush->Color = TColor(clBlack);     // odpowiednie kolory na początek
   bgColor->Brush->Color = TColor(clWhite);

   StatusBar->Panels->Items[0]->Text = "Ołówek";// nazwa domyslego narzedzia w pasku statusu
   Image->Canvas->Refresh();                // Tworzenie pola do rysowania
   sprejowanie->Enabled = false;
   FRysuj_pro = false;
   Form1->WindowState=wsMaximized;
   void zmiana () ;

}
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
Frytek18
Homos antropiczny
Homos antropiczny
 
Posty: 60
Dołączył(a): czwartek, 17 maja 2012, 19:05
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: WIN XP 32 bit
Kompilator: Embarcadero RAD Studio 2010 C++
Gadu Gadu: 5032466
    Windows XPFirefox

Re: Drukowanie TImage

Nowy postprzez Cyfrowy Baron » wtorek, 22 maja 2012, 20:26

A gdzie w tym kodzie masz funkcję lub zdarzenie odpowiedzialne za drukowanie czegokolwiek zaraz po odpaleniu programu. Ja widzę tam drukowanie tylko w zdarzeniu OnClick dla przycisku Drukuj1 co oznacza, że drukowanie rozpocznie się dopiero po wciśnięciu tego przycisku. Ty chcesz żeby program cokolwiek drukował podczas uruchamiania? Czy Image coś zawiera w chwili uruchamiania?
Cokolwiek chcesz zrobić podczas uruchamiania to musisz to zrobić w zdarzeniu OnShow dla formularza głównego aplikacji, czyli u Ciebie dla Form1.
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: Drukowanie TImage

Nowy postprzez Frytek18 » środa, 23 maja 2012, 11:15

Chodzi o to ze cos namaluje na image nie i chce to wydrukowac ale nie da sie bo wywala mi bład a jak wczytam jakas bmp to juz moge drukowac
Avatar użytkownika
Frytek18
Homos antropiczny
Homos antropiczny
 
Posty: 60
Dołączył(a): czwartek, 17 maja 2012, 19:05
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: WIN XP 32 bit
Kompilator: Embarcadero RAD Studio 2010 C++
Gadu Gadu: 5032466
    Windows XPFirefox

Re: Drukowanie TImage

Nowy postprzez Frytek18 » środa, 23 maja 2012, 12:28

A własnie tam jest metoda tzn rubber-banding nie chciałem ja przerobi na elipse ale chyba sie nie da pomozesz?
Avatar użytkownika
Frytek18
Homos antropiczny
Homos antropiczny
 
Posty: 60
Dołączył(a): czwartek, 17 maja 2012, 19:05
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: WIN XP 32 bit
Kompilator: Embarcadero RAD Studio 2010 C++
Gadu Gadu: 5032466
    Windows XPFirefox

Re: Drukowanie TImage

Nowy postprzez Cyfrowy Baron » środa, 23 maja 2012, 17:05

Frytek18 napisał(a):Chodzi o to ze cos namaluje na image nie i chce to wydrukowac ale nie da sie bo wywala mi bład a jak wczytam jakas bmp to juz moge drukowac


U mnie drukuje niezależnie od tego czy jest tam bitmapa czy nie. Nieco zmodyfikowałem kod. W załączniku znajdziesz przykładowy program i pliki z kodem.

TestDrukowania.7z




Frytek18 napisał(a):ubber-banding nie chciałem ja przerobi na elipse


Nic prostszego za rysowanie prostokąta w tej metodzie odpowiada funkcja Prostakat(), która u Ciebie wygląda tak:

KOD cpp:     UKRYJ  
void TForm1::Prostokat(void)       //Do kwaratu procedura
{
Image->Canvas->Pen->Width = suwak->Position;
Image->Canvas->Brush->Style = bsClear;
Image->Canvas->Pen->Style = bsDiagCross;

Image->Canvas->Rectangle(prost_s.x, prost_s.y, prost_k.x, prost_k.y);
}
Chcesz by rysowała elipsę, to zamiast funkcji Rectangle wstaw funkcję Elipse.

Umieszcza funkcja przynależnej do klasy nad konstruktorem tej klasy to brzydki zwyczaj, chyba pozostało to Tobie z aplikacji konsolowych.
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
    Windows XPFirefox

Re: Drukowanie TImage

Nowy postprzez Frytek18 » środa, 23 maja 2012, 17:57

Pewnie cos nie tak z programem mam bo u mnie nie drukuje tylko wtedy kiedy wczytam mape.
Robie tak z Elipsa to mi nie działa jak należy
Kod: Zaznacz cały
void TForm1::kolo()       //Do kola procedura
{
Image->Canvas->Pen->Width = suwak->Position;
Image->Canvas->Brush->Style = bsClear;
Image->Canvas->Pen->Style = bsDiagCross;
Image->Canvas->Ellipse(kolo_s.x, kolo_s.y, kolo_k.x, kolo_k.y);
}

Kod: Zaznacz cały
void __fastcall TForm1::ImageMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
        int X, int Y)
    case 10:
            kolo_s.x = X;
            kolo_s.y = Y;
            FPierwszyKolo = true;
            FRysuj_kolo = true;
      break;

Kod: Zaznacz cały
void __fastcall TForm1::ImageMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift,
        int X, int Y)
   if (narzedzie == 10) {
                  if (FRysuj_kolo == true)
   {
      Image->Canvas->Pen->Mode = pmCopy;
     if (FPierwszyKolo == false) kolo();
     prost_k.x = X;
     prost_k.y = Y;
     FPierwszyKolo = false;

     kolo(); // //rysuje nowe kolo
      }

Kod: Zaznacz cały
void __fastcall TForm1::ImageMouseMove(TObject *Sender, TShiftState Shift, int X,
        int Y)
   case 10:
            if (FRysuj_kolo == true){
      Image->Canvas->Pen->Mode = pmNotXor;
                   //to klucz do wymazywania
     if (FPierwszyKolo == false) kolo()   ;
                   //wymazuje poprzedni prostokąt
     prost_k.x = X;
     prost_k.y = Y;
     FPierwszyKolo = false;

     kolo(); // //rysuje nowy prostokąt
      }
      break;
Avatar użytkownika
Frytek18
Homos antropiczny
Homos antropiczny
 
Posty: 60
Dołączył(a): czwartek, 17 maja 2012, 19:05
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: WIN XP 32 bit
Kompilator: Embarcadero RAD Studio 2010 C++
Gadu Gadu: 5032466
    Windows XPFirefox

Re: Drukowanie TImage

Nowy postprzez Cyfrowy Baron » środa, 23 maja 2012, 18:03

Frytek18 napisał(a):Robie tak z Elipsa to mi nie działa jak należy


Zauważ, że w funkcji kolo() do rysowania elipsy używasz zmiennych kolo_s.x, kolo_s.y, kolo_k.x, kolo_k.y podczas gdy w zdarzeniu OnMouseMove nie ma już żadnej z tych zmiennych, ale są za to prost_k.x = X, prost_k.y = Y;. W OnMOuseUp zresztą też.



Frytek18 napisał(a):Pewnie cos nie tak z programem mam bo u mnie nie drukuje tylko wtedy kiedy wczytam mape.

Tego nie wiem, być może to wina przestarzałego środowiska. By to sprawdzić napisz w nim program dokładnie tak samo jak ja to zrobiłem w podanym załączniku.



Używaj BBCode CPP zamiast CODE.
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: Drukowanie TImage

Nowy postprzez Frytek18 » środa, 23 maja 2012, 18:11

Jestes Boski normalnie dobra dzieki
Avatar użytkownika
Frytek18
Homos antropiczny
Homos antropiczny
 
Posty: 60
Dołączył(a): czwartek, 17 maja 2012, 19:05
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: WIN XP 32 bit
Kompilator: Embarcadero RAD Studio 2010 C++
Gadu Gadu: 5032466
    Windows XPFirefox

Re: Drukowanie TImage

Nowy postprzez Frytek18 » środa, 23 maja 2012, 18:24

Sory ze tak Ci zawracam głowe a czy dało bys sie tą metode jakos wykorzystac do kopiowania zaznaczonego miejsca na Image?
Avatar użytkownika
Frytek18
Homos antropiczny
Homos antropiczny
 
Posty: 60
Dołączył(a): czwartek, 17 maja 2012, 19:05
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: WIN XP 32 bit
Kompilator: Embarcadero RAD Studio 2010 C++
Gadu Gadu: 5032466
    Windows XPFirefox

Następna strona

  • 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 1 gość