Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Delphi] - Delphi - wytłumaczenie linijek

hunter999 25 Sty 2016 12:09 753 16
  • #1 25 Sty 2016 12:09
    hunter999
    Poziom 18  

    Może mi ktoś wytłumaczyć na przykładzie tych linijek, co one robią?

    Kod: delphi
    Zaloguj się, aby zobaczyć kod



    Chodzi mi głównie o to:
    Kod: delphi
    Zaloguj się, aby zobaczyć kod

    0 16
  • #2 25 Sty 2016 12:16
    arnoldziq
    Moderator Programowanie

    Te "linijki" pobierają obraz załadowany do kontrolki "zdjęcie", przeprowadzają na nim operację (Emboss kojarzy mi się z jakimś filtrem obrazu, ale nie sądzę, żeby to była wbudowana funkcja Delphi), a następnie przenoszą "poprawiony" obraz z powrotem do kontrolki.

    0
  • #3 25 Sty 2016 12:21
    hunter999
    Poziom 18  

    bmp := TBitmap.Create;
    bmp := Zdjecie.Picture.Bitmap;
    Czyli tutaj pobiera zdjęcie i załadowuje go do Zdjecie.Picture.Bitmap; ?

    Emboss(bmp,20);
    Tutaj mam filtr tak i owszem ale co robi bmp i te 20 ?

    0
  • #4 25 Sty 2016 12:54
    arnoldziq
    Moderator Programowanie

    hunter999 napisał:
    Emboss(bmp,20);
    Tutaj mam filtr tak i owszem ale co robi bmp i te 20 ?
    Tak, ta linia wywołuje jakieś operacje na obrazie. Ale jakie? Nie mam pojęcia.
    hunter999 napisał:
    bmp := TBitmap.Create;
    bmp := Zdjecie.Picture.Bitmap;
    Czyli tutaj pobiera zdjęcie i załadowuje go do Zdjecie.Picture.Bitmap; ?
    Wręcz odwrotnie. Tworzysz nową bitmap-ę i przypisujesz do niej obraz z kontrolki 'zdjecie'.

    0
  • #5 25 Sty 2016 12:55
    rb401
    Poziom 32  

    Ta procedura wygląda mi na niezbyt poprawną.

    - W procedurze jest tworzony tymczasowy, lokalny, nie przekazywany gdzieś dalej, obiekt bmp ale brak destruktora na końcu procedury:

    Kod: delphi
    Zaloguj się, aby zobaczyć kod


    - linijka:
    Kod: delphi
    Zaloguj się, aby zobaczyć kod

    nie kopiuje obiektu, tylko zmienia wskaźnik bmp na wskaźnik tej drugiej bitmapy, tracąc bezpowrotnie wskaźnik na ten właśnie lokalny obiekt utworzony linijkę wcześniej (tym bardziej nie można już zwolnić pamięci po tym obiekcie).
    Powoduje to że tak właściwie ten tymczasowy obiekt nie ma sensu i razem z pierwszym błędem powoduje "zjadanie" pamięci przy każdym użyciu tej procedury.
    Powinno być:
    Kod: delphi
    Zaloguj się, aby zobaczyć kod

    1
  • #6 25 Sty 2016 16:53
    hunter999
    Poziom 18  

    Ok a ta linjijka przypisuje do bmp(bitmapy dynamicznej) zdjecie z Timage czyli pola z formy gdzie wyświetla sie obraz czy odwrotnie ?

    Kod: delphi
    Zaloguj się, aby zobaczyć kod

    0
  • #8 25 Sty 2016 18:43
    hunter999
    Poziom 18  

    Czyli z BMP do Timage ?

    0
  • #10 26 Sty 2016 09:17
    hunter999
    Poziom 18  

    A co po kolei wykonuje ta funkcja ?

    Kod: delphi
    Zaloguj się, aby zobaczyć kod

    0
  • #11 26 Sty 2016 10:12
    arnoldziq
    Moderator Programowanie

    Ta funkcja "robi" prawie dokładnie to, co mówi jej nazwa; "Integer to Byte"; przycina wrzosowaci integer tak, aby "zmieściły" się w zmiennej typu byte.
    Z tym, że jest to konwersja stratna (nie może być inaczej); wszystkie wartości ujemne zą zamieniane na 0 a wartości powyżej 255 na 255.

    0
  • #12 27 Sty 2016 17:17
    hunter999
    Poziom 18  

    Czy dobrze to rozumuję ?

    Kod: delphi
    Zaloguj się, aby zobaczyć kod

    0
  • #13 27 Sty 2016 18:29
    Dżyszla
    Poziom 42  

    AnsiString to taki String ale tylko na pojedynczych bajtach dla litery - czyli nie obsługuje UTF/Unicode. Zupełnie nie rozumiem użycie tego typu w podanym kodzie.
    TJPEGImage to klasa obsługi obrazów JPEG. Nie służy wyłącznie do otwierania plików, a rozszerzenie pliku nie jest w żaden sposób wymagane do wczytania do klasy (niestety MS tak wtłoczył ludziom, że rozszerzenie determinuje zawartość pliku). TBitmap to obsługa map bitowych, a TPNGImage - obrazów w formacie PNG.

    Generalnie kod jest niepoprawny, bo zmienna bmp nie jest w żaden sposób zainicjowana, więc w najlepszym razie - poza wyciekami pamięci związanej z brakiem zwolnienia obiektu jpg - nic się nie stanie po wybraniu pliku w oknie dialogowym.
    Pomijam już, że kod jest niekompletny i niekompilowalny przez to.

    0
  • #14 27 Sty 2016 19:36
    hunter999
    Poziom 18  

    Teraz perocedura jest kompletna, mógł by mi to ktoś poprawić co jest źle i opisać żebym mógł to zrozumieć ?

    Kod: delphi
    Zaloguj się, aby zobaczyć kod

    0
  • #15 27 Sty 2016 19:46
    Dżyszla
    Poziom 42  

    Teraz jest lepiej.

    Dla optymalizacji przy sprawdzaniu rozszerzenia lepiej byłoby użyć ciągłości warunków if ... else if ... else if. Bo jeśli pierwszy się sprawdzi, to reszta nie ma sensu. Brakuje też obsługi sytuacji wyboru pliku z nieprzewidzianym rozszerzeniem. Dla bezpieczeństwa warto też upewnić się co do zwolnienia obiektu, gdyby coś złego stało się w trakcie jego wykonywania, zgodnie ze schematem:

    Kod: Delphi
    Zaloguj się, aby zobaczyć kod

    Wciąż brakuje też zwolnienia obiektu bmp - on po przypisaniu nie musi już istnieć, bo został "skopiowany" na obiekt TBitmap będący elementem TImage.

    0
  • #16 27 Sty 2016 23:35
    hunter999
    Poziom 18  

    ex := UpperCase(ExtractFileExt(OpenPictureDialog1.FileName)); //Co to robi
    jpg := TJPEGImage.Create; // tworzy bitmapę ?
    jpg.LoadFromFile(OpenPictureDialog1.FileName); //ładuję z pliku i co dalej?

    0