Kopiowanie obiektu Image

dział ogólny

Re: Kopiowanie obiektu Image

Nowy postprzez polymorphism » piątek, 21 maja 2010, 13:18

Jak cSource to źródło, źródłem jest Image1 a Dest jest Image2. Trudno jest dopatrzeć się innej analogi. A jak winno być?

Nie rozumiem o co Ci chodzi. W każdym razie do tego co chcesz zrobić wystarczą zwykłe operacje na Canvasie.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Kopiowanie obiektu Image

Nowy postprzez duf » piątek, 21 maja 2010, 13:25

polymorphism napisał(a):Nie rozumiem o co Ci chodzi. W każdym razie do tego co chcesz zrobić wystarczą zwykłe operacje na Canvasie.

Zapiszę tekstem pierwszy Image1, następnie zapiszę go na dysk jako plik .bmp. Będzie to wzór. Następnie otworzę ten plik i załaduję go do Image1 i uzupełnię pole wartością "1" i to wydrukuję, następnie załaduje ponownie wzór z pliku do Image2 uzupełnię wartością "2" i to wydrukuję. Będę miał dwa identyczne wydruki z różnymi numerami: 1 i 2. Chciałem to przeprowadzić w pamięci komputera jako kopiowanie obiektu. Nie przypuszczałem, że wzbudzi to takie zainteresowanie ;-)
Avatar użytkownika
duf
Intelektryk
Intelektryk
 
Posty: 175
Dołączył(a): czwartek, 9 października 2008, 13:02
Podziękował : 17
Otrzymał podziękowań: 2
System operacyjny: Windows 10
Kompilator: XE8
Gadu Gadu: 0
    Windows XPFirefox

Re: Kopiowanie obiektu Image

Nowy postprzez Cyfrowy Baron » piątek, 21 maja 2010, 14:09

duf napisał(a):
Kod: Zaznacz cały
TImageImage2;
Image1 = new TImage(this);
Image1->Picture->LoadFromFile("filename");
TMemoryStreampms = new TMemoryStream();
pms->WriteComponent(Image1);
pms->Position 0;
pms->ReadComponent(Image2);
delete pms


Musisz zdefiniować Image2, gdyż puki co masz tylko deklarację:

Kod: Zaznacz cały

TImage
Image2;
Image2 = new TImage(this);
Image2->Parent this;

TImage *Image1;
Image1 = new TImage(this);
Image1->Parent this;

Image1->Picture->LoadFromFile("filename");

TMemoryStreampms = new TMemoryStream();
pms->WriteComponent(Image1);
pms->Position 0;
pms->ReadComponent(Image2);

delete pms;
 


Tak będzie działać, ale to co ty chciałeś zrobić to jest rzutowanie, ale w przypadku rzutowania, obiekt na który rzutujesz inny obiekt nie jest obiektem samodzielnym czyli nadal masz jeden obiekt:

Kod: Zaznacz cały
TImage *Image1;
Image1 = new TImage(this);
Image1->Parent = this;

TImage *Image2 = Image1;


Przy rzutowaniu de facto wciąż dysponujesz tylko jednym obiektem.
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: Kopiowanie obiektu Image

Nowy postprzez polymorphism » piątek, 21 maja 2010, 14:12

Zapiszę tekstem pierwszy Image1 (...)

No i what's the point? Zamiast zapisywać ów wzór go do pliku, zapisz do jakiegoś obiektu TBitmap, a następnie z niego kopiuj do obiektu TImage. Zresztą chyba wcześniej Baron już napisał jak powinieneś to zrobić.

Nie przypuszczałem, że wzbudzi to takie zainteresowanie ;-)

Sam je podsycasz, wszystko zostało wyjaśnione, tylko Ty się upierasz przy czymś, co nie istnieje - quasi warstwy w GDI. Jeszcze raz napiszę: żeby narysować nowy tekst (pozycję), wpierw musisz zamalować tłem stary napis, inaczej tego nie zrobisz.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Kopiowanie obiektu Image

Nowy postprzez Cyfrowy Baron » piątek, 21 maja 2010, 14:24

Proponowałem już obiekt typu TBitmap, potem kopiowanie z wykorzystaniem klasy TMemoryStream, była nawet propozycja użycia funkcji CopyRect. Jest tyle możliwości, ale duf upiera się przy czymś, czego ja już nie rozumiem.
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: Kopiowanie obiektu Image

Nowy postprzez duf » piątek, 21 maja 2010, 14:25

Cyfrowy Baron napisał(a):... ale to co ty chciałeś zrobić to jest rzutowanie, ale w przypadku rzutowania, obiekt na który rzutujesz inny obiekt nie jest obiektem samodzielnym czyli nadal masz jeden obiekt:

Kod: Zaznacz cały
TImage *Image1;
Image1 = new TImage(this);
Image1->Parent = this;

TImage *Image2 = Image1;


Przy rzutowaniu de facto wciąż dysponujesz tylko jednym obiektem.

Tak na to już wpadłem i przetestowałem. Adres wskaźnika obiektu skopiowany jest do drugiego wskaźnika i nic to nie da prócz tego, że mam dwa wskaźniki do jednego obiektu.
Avatar użytkownika
duf
Intelektryk
Intelektryk
 
Posty: 175
Dołączył(a): czwartek, 9 października 2008, 13:02
Podziękował : 17
Otrzymał podziękowań: 2
System operacyjny: Windows 10
Kompilator: XE8
Gadu Gadu: 0
    Windows XPFirefox

Re: Kopiowanie obiektu Image

Nowy postprzez Cyfrowy Baron » piątek, 21 maja 2010, 14:28

duf napisał(a):że mam dwa wskaźniki do jednego obiektu.


To oczywiście nieprawda. Masz jeden obiekt i jeden wskaźnik na ten obiekt, chyba, że rozumiesz to w ten sposób, że obiekt jest wskaźnikiem na samego siebie :shock: .
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: Kopiowanie obiektu Image

Nowy postprzez duf » piątek, 21 maja 2010, 14:35

Cyfrowy Baron napisał(a):
duf napisał(a):że mam dwa wskaźniki do jednego obiektu.


To oczywiście nieprawda. Masz jeden obiekt i jeden wskaźnik na ten obiekt, chyba, że rozumiesz to w ten sposób, że obiekt jest wskaźnikiem na samego siebie :shock: .

Skoro przypisywana jest wartość jednego wskaźnika do drugiego
Kod: Zaznacz cały
TImage *Image2 = Image1;

to Image2 nie kopiuje adresu z Image1?
Avatar użytkownika
duf
Intelektryk
Intelektryk
 
Posty: 175
Dołączył(a): czwartek, 9 października 2008, 13:02
Podziękował : 17
Otrzymał podziękowań: 2
System operacyjny: Windows 10
Kompilator: XE8
Gadu Gadu: 0
    Windows XPFirefox

Re: Kopiowanie obiektu Image

Nowy postprzez Cyfrowy Baron » piątek, 21 maja 2010, 14:37

Image2 jest wskaźnikiem na Image1, a gdzie masz drugi wskaźnik, bo Image1 jest obiektem nie wskaźnikiem.
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: Kopiowanie obiektu Image

Nowy postprzez duf » piątek, 21 maja 2010, 14:57

Cyfrowy Baron napisał(a):Image2 jest wskaźnikiem na Image1, a gdzie masz drugi wskaźnik, bo Image1 jest obiektem nie wskaźnikiem.

Aja myślałem, że Image1 jest wskaźnikiem na zaalokowany obszar w pamięci podręcznej. Zresztą obiektem musiałbym odwoływać się do zawartości klasy poprzez kropkę a nie strzałkę.
Avatar użytkownika
duf
Intelektryk
Intelektryk
 
Posty: 175
Dołączył(a): czwartek, 9 października 2008, 13:02
Podziękował : 17
Otrzymał podziękowań: 2
System operacyjny: Windows 10
Kompilator: XE8
Gadu Gadu: 0
    Windows XPFirefox

Re: Kopiowanie obiektu Image

Nowy postprzez duf » piątek, 21 maja 2010, 15:17

Wróciłem do przednich odpowiedzi i rzeczywiście jest tam odpowiedź na moje problemy. Rozwiązanie mogłoby wyglądać tak:
Kod: Zaznacz cały
newimage = new TImage(this);
newimage->Width = 950;
newimage->Height = 1280;
newimage->Proportional = true;

newimage->Picture->LoadFromFile( plik.bmp );

newimage->Canvas->Brush->Style = bsClear;
newimage->Canvas->TextOut( 545, 80, "cos tam" );

Graphics::TBitmap* bmp = new Graphics::TBitmap;
bmp->kopiuję

newimage->Canvas->TextOut( 70, 73, "1" );

newimage->Picture->Assign( bmp );
newimage->Canvas->Brush->Style = bsClear;
newimage->Canvas->TextOut( 70, 73, "2" );

Mam problem z kopiowaniem do TBitmap`y. Użyłem
Kod: Zaznacz cały
bmp->Canvas->CopyRect(Rect(0, 0, newimage->Width, newimage->Height), newimage->Canvas, Rect(0, 0, newimage->Width, newimage->Height));

ale to nic nie dało kartka wychodzi czysta bez niczego.

EDIT:
Już wiem:
Kod: Zaznacz cały
bmp->Assign(newimage->Picture);

To załatwia sprawę. Dziękuję wszystkim za cierpliwość do mnie :-)
Avatar użytkownika
duf
Intelektryk
Intelektryk
 
Posty: 175
Dołączył(a): czwartek, 9 października 2008, 13:02
Podziękował : 17
Otrzymał podziękowań: 2
System operacyjny: Windows 10
Kompilator: XE8
Gadu Gadu: 0
    Windows XPFirefox

Poprzednia strona

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