2011-08-13 9 views
12

Chcę załadować plik PNG z przezroczystym tłem w TImageList i użyć go w TMainMenu (poprzez TAction).
Jednak w Delphi tło jest po prostu czarne. Czy obsługa formatu PNG jest tylko częściowo wdrożona w Delphi?Przejrzysty obraz PNG (z TImageList) w TMainMenu

This Facet mówi, że pracował dla niego, ale z przyciskiem zamiast z menu głównego.

Moja konfiguracja:

  • Mój obraz jest 8 bitów na kolor oraz 8 bitów dla kanału przezroczystości (Próbowałem też z 1 bit dla przejrzystości, ale nadal nie działa). Obraz wygląda dobrze w każdym innym programie.
  • Delphi XE.
  • W edytorze TImageList "kolor przezroczysty" i "kolor wypełnienia" są ustawione na "Domyślne" i są wyłączone.

Uważaj na nieoczekiwane zachowanie:

DELPHI straci Wszystkie zdjęcia (w całym formie nie tylko w TIMAGELIST), gdy użytkownik zmienia wartość nieruchomości colorDepth.

Błąd można odtworzyć na żądanie. Obrazy utracone można odzyskać z poprzedniego pliku DFM z folderu "histoy".

+1

Witam, RRuz. Używam TImageList. Ma właściwości DrawingStyle i może być ustawiony tylko na "przezroczysty" (który nadal nie działa). Ale nie ma cd32bit. – Ampere

+2

Niestety mam na myśli właściwość 'ColorDepth' musi być ustawiona na' cd32Bit' – RRUZ

+0

Aktualizacja: istnieje właściwość ColorDepth, ale jeśli ustawię ją na "cd32Bit", obrazy nie będą już malowane w menu. – Ampere

Odpowiedz

4

Oto rozwiązanie: http://www.aha-soft.com/faq/delphi-imagelist-png.htm
uważaj: to usunie (bez uprzedzenia dodawanie wszystkich obrazów z TImageList), więc rozwiązanie jest tylko dla tych, którzy mają tylko kilka obrazów załadowanych. BACKUP YOUR obrazy i plik DFM również.

W moim przypadku mam sposób ponad 100, więc nie jest całkiem produktywny dla mnie wyeksportować wszystkie obrazy jeden po drugim i załadować je z powrotem w tej samej kolejności.

Wniosek jest taki, że Delphi XE nie jest jeszcze gotowy do pracy z przezroczystymi plikami PNG (w TImageList). Lepiej wrócę do starej biblioteki PNG innej firmy lub po prostu użyję prostych obrazów BMP.


Aktualizacja:

I to jest, jak to zrobić pod Delphi 7: http://www.ic0de.org/showthread.php?10477-TUT-Working-with-delphi-s-imagelist-and-transparency

+0

Delphi XE jest prawie (patrz poniżej) gotowy do pracy z kanałem alfa PNG zgodnie z linkiem. Ale musisz wiedzieć, jak pracować z edytorem TImageList. Sposób, w jaki używamy, polega na utworzeniu kopii zapasowych wszystkich obrazów w katalogu i ponumerowaniu, np. 000_image1.png, 001_image2.png i tak dalej. Następnie przy każdej zmianie po prostu wyczyszczamy listę obrazów i ponownie ładujemy obrazy z tego katalogu, można to zrobić za pomocą jednego polecenia Dodaj ..., a obrazy są uporządkowane tak jak poprzednio.Istnieje jednak jeden (dziś banalny) problem: bez włączonych motywów wykonawczych przezroczystość PNG nie działa w Delphi XE. –

6

Używałem TPngComponents od Delphi 7. Zapewnia to bardzo dobrą obsługę png dla większości komponentów wbudowanych delphi/stron trzecich. Embarcadero zakupiło kolejny dobrze znany komponent wspierający Open Source PNG Supporting znany jako TPngImage i wbudowany w natywne wsparcie graficzne Delphi w późniejszych wersjach Delphi. Kiedy zmieniłem Delphi 2010, myślę, że Delphi ma teraz natywne wsparcie i przetestuje natywne wsparcie, ale okazuje się, że wsparcie alfa nie jest wystarczająco dobre.

Wykorzystałem ponownie tę TPngComponents i uzyskałem lepszą obsługę większości komponentów, w tym menu głównego. Myślę, że pakiet powinien nadawać się do DXE z ograniczonymi modyfikacjami.

edytuj: Podziękowania dla Uwe Raabe za wskazanie, że zakupiony produkt Codegear (obecnie Embarcadero) był kolejnym składnikiem TPngImage niż TPngComponent.

+1

Ok. Dzięki. Jest to więc błąd Delphi. Wrócę do starego dobrego formatu BMP. Długo działająca Delphi i "nowoczesne" interfejsy GUI, które możemy z nią tworzyć. – Ampere

+0

PngComponents nie został kupiony przez CodeGear (obecnie Embarcadero). To było tylko wsparcie dla PNG od Gustavo Dauda. PngComponents jest i zawsze był pakietem komponentów opartych na wsparciu PNG stworzonym przez Martijn Saly. Obecna wersja obowiązuje dla D2009 i wyżej. –

+0

@Uwe Rabbee Oh Sprawdziłem i tak, pomieszałem TPngImage z TPngComponent. Szczegóły dotyczące Codegear (obecnie Embarcadero) można znaleźć w [Blogu Nicka Hodgesa] (http://blogs.embarcadero.com/nickhodges/2008/08/13/39100). Bez względu na to, dlaczego wsparcie natywne Delphi różni się od TPNGComponent, którego używałem. Dzięki za wskazanie tego, a ja zmienię moją wiadomość. – Justmade

12

Nie ma powodu do tworzenia kopii zapasowych całego pliku DFM.

Zanim zrobisz coś do swojego ImageList, wyeksportuj swoje obrazy: kliknij przycisk "Eksportuj" w edytorze listy obrazów, aby zapisać wszystkie obrazy w jednym pliku .BMP.

Po zmieniających właściwości: ColorDepth = cd32Bit, DrawingStyle = dsTransparent

Należy kliknąć przycisk „Dodaj” i wybierz plik, który wcześniej wyeksportowany. Następnie obrazy będą rysowane z przezroczystością w menu i na paskach narzędzi (przynajmniej w D2010) ... Nie musisz używać komponentów innych firm.

+1

Jeśli przycisk "eksportuj" eksportuje wszystkie obrazy naraz, to w jaki sposób wyeksportować pojedynczy obraz? (w moim przypadku przycisk "Eksportuj" eksportuje tylko jedno zdjęcie: – Ampere

+1

Ten przycisk może wykonać 2 czynności: 1) Jeśli nic nie zostanie wybrane na liście "Obrazy", wyeksportuje wszystkie obrazy w liście obrazów. 2) Jeśli wybrana zostanie jedna lub więcej ikon, wyeksportowane zostaną tylko wybrane obrazy. – djsoft

+0

Jak "nic nie zaznaczasz" na liście "Obrazy"? Po dwukrotnym kliknięciu komponentu 'TImageList' pierwszy obrazek jest zawsze wybierany początkowo, a kliknięcie przycisku ** Export ** będzie wymagało jedynie eksportu tego obrazu. Jak wyeksportować cały plik obrazów? –