Kopiowanie fragmentu Image1 do Image1 (jpg)

Kopiowanie fragmentu Image1 do Image1 (jpg)
T6
  • Rejestracja:około 15 lat
  • Ostatnio:prawie 12 lat
0

Czemu proste przenoszenie obszaru nie działa?

Jak to powinno być prawidłowo?

Kopiuj
Image1.Canvas.CopyRect(Rect(10,10,20,20),Image1.Canvas,Rect(30,30,40,40));

 
edytowany 2x, ostatnio: madmike
KA
  • Rejestracja:prawie 20 lat
  • Ostatnio:7 minut
  • Lokalizacja:Gorlice
1

Bo ma być:

Kopiuj
Image1.Picture.Bitmap.Canvas

Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.
T6
  • Rejestracja:około 15 lat
  • Ostatnio:prawie 12 lat
0

Jeśli faktycznie ma być:

Image1.Picture.Bitmap.Canvas

to bardzo proszę do tego przykładu wstawić ten zapis

Image1.Canvas.CopyRect(Rect(10,10,20,20),Image1.Picture.Bitmap.Canvas,Rect(30,30,40,40));

i skompilować bo chyba istotny jest wynik praktyczny ????

bo oczywiście nie działa gdy obrazkiem jest format JPG

edytowany 1x, ostatnio: tester_68k
ŁF
"skompilować bo chyba istotny jest wynik praktyczny" - a po polsku? napisał kAzek co masz zrobić, zrobiłeś tylko połowę tego.
madmike
  • Rejestracja:ponad 19 lat
  • Ostatnio:ponad 5 lat
0

Chyba żartujesz? Nie umiesz nawet przepisać i podstawić w dwa miejsca?

Kopiuj
Image1.Picture.Bitmap.canvas.CopyRect(Rect(10,10,20,20),Image1.Picture.Bitmap.Canvas,Rect(30,30,40,40));

SI
  • Rejestracja:prawie 15 lat
  • Ostatnio:prawie 11 lat
  • Postów:184
0

Panowie, naskoczyliście na testera_68k, że nie potrafi nawet przepisać kawałka kodu, więc ja stanę w jego obronie :)

Sprawa nie jest wcale taka oczywista. Jeżeli do Image wczytamy obrazek w formacie bmp, to nie ma znaczenia czy napiszemy Image1.Picture.Bitmap.Canvas, czy od razu Image1.Canvas. Możemy tworzyć dowolne kombinacje zapisu dla Canvas, a kod i tak zawsze wykona się poprawnie.

Problem pojawia się, gdy Image zawiera obrazek w formacie jpg. Jeżeli płótno, z którego kopiujemy zapiszemy Image1.Canvas, czyli kod będzie wyglądał np. tak

Kopiuj
Image1.Picture.Bitmap.Canvas.CopyRect(Rect(10,10,20,20), Image1.Canvas, Rect(30,30,40,40));

to Debuger na to: Project raised exception class EInvalidOperation with message 'Can only modify an image if it contains a bitmap'.

W przypadkach jak niżej

Kopiuj
Image1.Canvas.CopyRect(Rect(10,10,150,150), Image1.Picture.Bitmap.Canvas, Rect(40,40,180,180));
Image1.Picture.Bitmap.Canvas.CopyRect(Rect(10,10,150,150), Image1.Picture.Bitmap.Canvas, Rect(40,40,180,180));

co prawda nie otrzymamy żadnego wyjątku, ale też i program nie wykona się poprawnie. Po prostu obrazek zniknie.

Co więc teraz poradzicie autorowi wątku?

KA
Nawet jeżeli jest BMP to ma znaczenie musi być Image1.Picture.Bitmap.Canvas przynajmniej w Delphi 7. A swoją drogą dlaczego autor od początku nie napisał że chodzi o JPG.
SI
A ja będę się upierał, że nie musi, bo sprawdziłem
KA
Ja też i musi.
madmike
  • Rejestracja:ponad 19 lat
  • Ostatnio:ponad 5 lat
2
simplex napisał(a)

Co więc teraz poradzicie autorowi wątku?

Poradzimy na przyszłość od razu cały problem opisać porządnie - nie działa to bardzo szerokie i tak naprawdę nic nie mówiące pojęcie, a informacja o tym, że to jpg też pojawia się niejako przypadniem dopiero w kolejnym poście już po jego edycji... Gdyby jego opis choć odrobinę przypominał Twój, to podejrzewam, że już dawno by otrzymał odpowiedź rozwiązującą jego problem.

A zresztą tu się i tak mści programowanie "na komponentach" i nie do końca świadomość jak to działa i na czym się operuje - w taki prosty sposób się tego nie da od razu zrobić - co nie oznacza, że rozwiązania i wytłumaczenie nie da się w prosty sposób znaleźć. Na dobrą sprawę trzeba przekształcić to co jest w TImage na bitmapę i dopiero wtedy kopiować jeden kawałek w inne miejsce.

Kopiuj
var
  jpg : TJPEGImage;
begin
  //warunek, ponieważ możemy do Image1 załadować zarówno bmp jak i jpg, a poniższe operacje są właściwe tylko dla jpg
  //jeśli jesteś na 110% pewien, że tam jest jpg, to sprawdzanie warunku możesz pominąć
  if Image1.Picture.Graphic is TJPEGImage then
    begin
    jpg := TJPEGImage.Create;
    //odczytujemy to co jest w Image1, przekształcamy na bmp i zapisujemy z powrotem do Image1
    jpg.Assign(Image1.Picture);
    jpg.DIBNeeded;
    Image1.Picture.Bitmap.Assign(jpg);
    jpg.Free;
    end;

  //teraz to co zostało powyżej już napisane powinno działać
  Image1.Picture.Bitmap.Canvas.CopyRect(Rect(10, 10, 20, 20), Image1.Picture.Bitmap.Canvas, Rect(30, 30, 40, 40));

PS 1. Nie wiem czy delphi potrzebuje w uses jpeg czy nie, więc ew. trzeba to tam dopisać.

PS 2. Jakiekolwiek inne rozwiązania będą zapewne tylko jakąś przeróbką powyższego - jeśli koniecznie chcesz mieć w Image1 jpg, to po wszystkim musisz dokonać jeszcze konwersji na jpg albo całą operację kopiowania wykonywać na "zewnętrznej" bitmapie i po wszystkim skonwertować ją do jpg i dodać do Image1.

PS 3. Wyjaśnienie, dlaczego w ten sposób trzeba to zrobić można znaleźć w helpie porównując sobie properties TBitmap i TJPEGImage. Po prostu TJPEGImage (czyli nasze jpg załadowane do Image1) nie ma czegoś takiego jak canvas, a więc co za tym idzie nie da się wykonać żadnych operacji na canvas'ie (w tym i nieszczęsnego CopyRect).

PS 4. Przy tak marnym opisie problemu i fatalnym, nic nie mówiącym tytule wątku "Image1 do Image1" to i tak szczęście, że wątek trafił tylko do działu Newbie, a nie od razu do kosza, więc niejako przy okazji zachęcam do lektury Jak tytułować wątki na forum? :]

simplex, czy taka odpowiedź wystarczy?


edytowany 2x, ostatnio: madmike
olesio
Nie wiem jak nowsze Delphi, ale do wersji 7 włącznie trzeba dodać jpeg do sekcji uses.
SI
Tak, chyba że wczytamy obrazek JPG już na etapie projektowania, to kompilator sam doda moduł do sekcji "uses"
SI
  • Rejestracja:prawie 15 lat
  • Ostatnio:prawie 11 lat
  • Postów:184
0
madmike napisał(a)

Poradzimy na przyszłość od razu cały problem opisać porządnie - nie działa to bardzo szerokie i tak naprawdę nic nie mówiące pojęcie...

Zgadzam się z Tobą całkowicie, ale też nie mam złudzeń, że tak jak do tej pory, będą się pojawiały tematy w stylu: "pomóżcie", czy "mam problem". Dodatkowo w opisie autor wysili się do napisania jednego zdania, co do którego czasem można mieć wątpliwości, czy jest ono w ogóle napisane po polsku. Nieraz mam nawet chęć odpowiedzieć w podobnym stylu, urywając w pół zdania, aby nie przekroczyć długości posta autora, jednocześnie informując go w postscriptum, że "jak Kuba Bogu, tak Bóg Kubie". Tyle tylko, że mi się nie chce, a wątek i tak zapewne wyląduje w koszu, co ostatnio zdarza się częściej (i bardzo dobrze).

A wracając do tematu, to oczywiście Twoja odpowiedź jest jak najbardziej wystarczająca. Stosując kod, który podałeś wystarczy nawet od razu napisać w skrócie "Image1.Canvas" i wszystko działa. Jedyny mankament takiego rozwiązania, to chwilowe mignięcie obrazka, ale pewno można sobie z tym poradzić, gdy ktoś bardzo będzie chciał.

Tak więc masz u mnie "plus" :)

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)