Wątek zablokowany 2013-10-25 22:38 przez madmike.

Plik *.bmp, przeźroczystość i wygładzanie krawędzi

0

Witam

Czy istnieje jakaś forma wygładzania krawędzi w Delphi7? Chodzi mi o to:
http://i43.tinypic.com/346q90l.png
Zazwyczaj pracuję na plikach *.png gdzie przeźroczystość nie jest żadnym problemem...Tutaj muszę korzystać z plików w formacie *.bmp i przeźroczystość pochodzi z zielonego tła - problem jednak w tym, że nie działa to zbyt dokładnie. Sprawdza się to na prostych figurach geometrycznych, ale nie w tym przypadku...
Istnieje więc jakaś forma usunięcia tego efektu? Czy da się w ogóle zmusić Delphi7 do pracy na plikach *.png? Jest jakieś proste rozwiązanie?

Dziwi mnie, że posiadając wersję Delphi7 nie mogę korzystać z plików *.png gdy np tutaj:
widać, że taka możliwość jest...

Dziękuję z góry za odpowiedź.

0

Dzięki za link i resztę konwenansów. Od siebie dodam tylko - bo zdajesz nie ogarniać całości problemu; że nie jestem żadnym zasranym programistą i nie jest mi to do szczęścia potrzebne, ale każdy czasem potrzebuje pomocy. Wątpię by Pan - Panie idealny, nigdy nie potrzebował pomocy mechanika, bo sam się nie znasz na samochodach. Albo abyś nie potrzebował pomocy architekta, bo sam się nie znasz na budownictwie.

0

Co do filmiku to dziecko 14 lat (szacuje), do d**y micro i jeszcze nuta leci jak tłumaczy pzdr. Pewnie pomodyfikował pliki źródłowe albo wgrał sobie jakiegoś moda i nakręcił filmik (lata tą myszką jakby miał adhd)

0

A więc dziecko 14-letnie (jak szacujesz) zrobiło coś, o czym zdajesz się nie mieć zielonego pojęcia? Bo piszesz "albo..., albo...". To jak to jest? 14-latek może, a Tobie nawet myślami nie było dane tego ogarnąć? No proszę. Przyznam się szczerze, że bardziej szanuję tego 14-latka (jak szacujesz) z dupiatym mico i z gównianą muzą w tle, bo on chociaż był w stanie coś takiego zrobić, a Ty z łaską płodzisz jeden link i prujesz się jakbyś właśnie dokonał czegoś wielkiego...Jeśli to był szczyt Twojej cierpliwości, to gratuluję znudzenia życiem.

2

Niektóre zewnętrzne komponenty min. Alpha Control http://www.alphaskins.com/alite.php (link do bezpłatnej niestety ubogiej wersji ale dodającej wsparcie PNG) rejestrują swoje klasy obsługi obrazków różnych formatów tak że to później wygląda jak gdyby były wspierane natywnie (jak na filmiku).

Co do przeźroczystości w bitmapach definiowanie koloru jako przeźroczysty raczej działa poprawnie tyle że nie ma możliwości ustawienia tolerancji koloru jaki ma być przeźroczysty i wystarczy jak w danym pikselu jedna ze składowych koloru (RGB) różnie się nawet o 1 od zadanej jako przeźroczystą i ten piksel nie będzie przeźroczysty. Inaczej mówiąc wystarczy odrobinkę inny odcień (całkowicie nie zauważalnie dla ludzkiego oka) danego piksela a kolor już nie będzie przeźroczysty.

0

Ok, no więc zrobiłem wszystko tak jak gość na tym filmie:
Wszystko działa - mogę wybierać i ładować pliki PNG bez żadnych błędów, ALE...

Gdy skompiluję plik exe, ten niestety nie działa - nie pojawia się żaden błąd w Windowsie, ikona pliku exe pojawia się w pasku zadań, jednak nie widzę programu - klikając na ikonę exe z paska zadań nic nie widać.
Dzieje się tak za każdym razem gdy dodam plik PNG do programu i go skompiluję.

W wątku od hzmzp: PNG w Delphi jest informacja że aby wyświetlić plik PNG należy dodać fragment kodu na czerwono - jak pisałem NIE JESTEM PROGRAMISTĄ, więc czy ktoś mógłby poprawić dla mnie ten kod? Chodzi o obraz Image1:

http://pastebin.com/a8txmDkk
A podczas kompilowania mam takie info z logów:

[Warning] Misc.pas(33): Return value of function 'DelDir' might be undefined
[Hint] Misc.pas(66): Value assigned to 'w1' never used
[Warning] LstFile.pas(12): Method 'Destroy' hides virtual method of base type 'TObject'
[Hint] LstFile.pas(57): Value assigned to 'Params' never used
[Warning] GetFilesThr.pas(225): Combining signed and unsigned types - widened both operands
[Warning] GetFilesThr.pas(232): Combining signed and unsigned types - widened both operands
[Warning] GetFilesThr.pas(257): Combining signed and unsigned types - widened both operands
[Hint] GetFilesThr.pas(252): Value assigned to 'FParam' never used
[Warning] GetFilesThr.pas(341): Variable 'HostLineParam' might not have been initialized
[Hint] GetFilesThr.pas(469): Value assigned to 'NFiles' never used
[Hint] GetFilesThr.pas(449): Value assigned to 'HostsLines' never used
[Hint] GetFilesThr.pas(444): Value assigned to 'CFiles' never used

Będę wdzięczny za sprawdzenie kodu i pomoc. To ostatnia rzecz która jest mi potrzebna :)

dodanie znacznika <quote> dla treści błędu - fp

0

Przede wszystkim skąd pobrałeś to PngImage, bo są różne nie koniecznie zgodne ze sobą. Tak w ciemno nie wiedziąc z jakiego pngimage korzystasz mogę napisać że problem jest prawdopodobnie z kodem ok. linii 150 to tworzenie Regionu na postawie bitmapy a Ty ładujesz PNG.

0

Przede wszystkim...serdecznie dziękuję Ci za zainteresowanie. Już wszystko podaję:

  • Pliki PNGImage pobrałem dokładnie z tego linku (spokojnie, zero wirusów, sprawdziłem przed pobraniem): https://livreerp.googlecode.com/files/pngdelphi.rar
  • Pliki ImgBtn pobrałem z sieci i udostępniłem Ci je na swoim koncie MediaFire, ponieważ nie zapisałem źródła strony: http://www.mediafire.com/?k1bdipfklkkaqt5 Te pliki (PKImgBtn) pozwalają mi spokojnie otwierać projekt.
  • też sądziłem, że problem polega w formacie tła - pierwotnie tło było w formacie *.bmp. Ja, chciałbym skorzystać z dobrodziejstw formatu *.png i zwyczajnie zamieniłem tło na swoje w formacie *.png.

W kodzie widziałem, ze zaznaczone jest, iż oczekiwany jest format *.bmp :/ Nie wiem jednak jak mogę zmienić kod, bym mógł wstawić plik w formacie *.png? Mógłbyś podać mi treść kodu i linię którą muszę podmienić? Główny kod wstawiłem na pastebin: http://pastebin.com/a8txmDkk

0

Zmień w pliku UnitMain.pas procedurę FormCreate (to co jest na PasteBin w liniach od 126 do 165 na):

procedure TFMain.FormCreate(Sender: TObject);
var
  regn, tmpRegn, x, y: integer;
  nullClr: TColor;
  s_load: bool;
  Settings: TInifile;
begin
  s_load:=LoadSettings();
  if (s_load) then
  begin
    if (USettings[4]='0') then
    begin
      Settings := TInifile.Create(USettings[0]+'_settings.ini');
      Settings.WriteString('main','Installed','1');
      Settings.Free;
      CreateDesktopIcon(USettings[3],USettings[0],'Play Lineage II');
    end;
  end
  else
  begin
    FMain.Timer1.Enabled:=False;
    ShowMessage('ERROR: _settings.ini Not Found !');
    Application.Terminate; // .close çäĺńü íĺ ďđîéäĺň
  end;
 
  // Íŕâîäčě ęđŕńčâîńňü íŕ ôîđěó ...
  //linia poniżej raczej niepotrzebna, bo chyba cały czas jest image i on jest odrysowywany ale jak coś to można by przypisać ale kod wymagałby dodatkowej bitmapy
  //FMain.brush.bitmap:=Image1.picture.bitmap;
  nullClr := TPNGObject(Image1.picture.Graphic).TransparentColor;
  regn := CreateRectRgn(0, 0, image1.picture.Graphic.Width,
  image1.picture.Graphic.Height);
  for x := 1 to image1.picture.Graphic.Width do
    for y := 1 to image1.picture.Graphic.Height do
      if TPNGObject(Image1.picture.Graphic).Pixels[x - 1, y - 1] = nullClr then
      begin
        tmpRegn := CreateRectRgn(x - 1, y - 1, x, y);
        CombineRgn(regn, regn, tmpRegn, RGN_DIFF);
        DeleteObject(tmpRegn);
      end;
  SetWindowRgn(FMain.handle, regn, true);
end;

Uzyskany efekt i tak zależy od twego jak jest zrobiony obraz PNG (przy niektórych testowanych też miałem takie brzydkie krawędzie).

0

Po dokonaniu podanych przez Ciebie zmian i po skompilowaniu projektu do pliku exe, program odpala i jest widoczny (poprzednio nic nie było widać), ale...wszystko (poza plikiem *.png tła :/) jest widoczne.
Poniższy screen to przedstawia:
http://i42.tinypic.com/15plhjo.png

Od siebie dodam, że plik *.png zapisuję w Photoshop'ie tak jak każdy inny. Nie ma żadnej kompresji itd.
W dodatku, normalnie skompilowany plik exe - bez zmienionego tła, po uruchomieniu od razy pobiera aktualizacje z adresu hosta z pliku _settings.ini. W Dokonaniu Twoich zmian działa tylko opcja "Full Check" - po zmianie kodu na Twój, nie pobierane są automatycznie (po uruchomieniu pliku exe) aktualizacje - także tutaj też jest coś nie tak. Zmiany które dokonałeś dla _settinhs.ini są niepotrzebne. Tylko dla Image1, choć i tak efekt jest taki jak widać na załączonym screenie.

0

To w taki sposób nie zadziała.
Krawędzie w png są gładkie z powodu kanału alpha - przezroczystości konkretnych pikseli. Dany piksel ma powiedzmy przezroczystość 30%, przy jego rysowaniu pobierane jest tło znajdujące się pod spodem tego piksela i oba kolory są "mieszane" ze sobą (30% z piksela i 70% z tła). A w tym kodzie co tu masz coś takiego nie ma miejsca, Piksel ma albo 100% widoczności albo 0%, nie ma tam kanału alpha.

Aby coś takiego uzyskać trzeba utworzyć okno za pomocą CreateWindowEx i ręcznie ustawiać przezroczystość każdego piksela (kopiując wartości z pnga) przy użyciu UpdateLayeredWindow();

0

Pliki *.png nie korzystają z krycia kanału alpha...Pliki *.png są 24-bit'owe, nie 32...Format *.png zwyczajnie pozwala na korzystanie z przeźroczystości bez użycia kanału alpha (w odróżnieniu np od 32-bit'owych plików *.bmp) ;)
To o czym piszesz (przeźroczystości z kanału alpha) dotoczy 32-bit plików *.bmp, nie plików *.png.

0

@RoyMartin - skończysz wreszcie ze swoją arogancją, czy chcesz zostać nagrodzony brakiem dostępu do serwisu? Prywatne uwagi dotyczące tego, kto ma, a kto nie ma racji przenieście na PM;

Koniec awantur, a obu Panów odsyłam do dokumentacji, z której wszystko można się dowiedzieć:

ewentualnie:

jeśli lubicie spiski.

1 użytkowników online, w tym zalogowanych: 0, gości: 1