Obraz PGM w TImage.

K5
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 12 lat
  • Postów:30
0

Witam. Próbuje wczytać obraz PGM do komponentu TImage poleceniem image.picture.loadfromfile ale bez skutku... Ktoś może robił z was kiedyś coś takiego albo orientuje sie jak tego dokonać?

edytowany 2x, ostatnio: olesio
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 3 godziny
  • Lokalizacja:Tuchów
  • Postów:12167
0

Nie napisałeś nawet na jakim środowisku pracujesz...

Jeśli chodzi o dziadziusiowate Delphi 7 - standardowy TImage nie obsługuje tego typu plików, za to:

  • jpg
  • jpeg
  • bmp
  • ico
  • emf
  • wmf
    owszem; Nawet żeby wykorzystać png trzeba dodatkowe komponenty instalować (np. TPNGImage); Poszukaj w sieci jakichś dodatków pozwalających przechowywać taki typ pliku w ww. kontrolce;

Szczerze mówiąc pierwszy raz spotykam się z takim formatem plików (wstyd...);
Dla zainteresowanych: PGM Format Specification;

Gdybyś korzystał z nowszego środowiska jakim jest Lazarus - standardowy TImage obsługuje więcej formatów plików graficznych, w tym wspomniane *.pgm;


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 5x, ostatnio: flowCRANE
KA
Delphi 7 ma 10 lat więc co porównujesz? Porównaj sobie 10 letni komputer z nowym (nawet z dolnej półki). Delphi XE2 obsługuje: jpg, jpeg, bmp, ico, emf, wmf, tif, tiff, png, gif (w tym animowane) czyli praktycznie w 90% obsługa tych formatów wystarcza no chyba że piszesz np. przeglądarkę, czy edytor graficzny.
flowCRANE
No właśnie tą wersję porównuję, bo nie sądziłem, żeby początkujący programista posiadał Delphi XE2 - i miałem rację; Lazarusa mam, więc mogłem o nim napisać, za to XE2 nie i mieć nie chcę; Poza tym ja pracuję na 10-letnim notebook'w i jestem z niego nieziemsko zadowolony :P
flowCRANE
Czy mnie oczy mylą, czy XE2 nie obsługuje *.pgm...?
KA
pgm nie obsługuje i nic w tym dziwnego przecież to mało popularny format jak sam napisałeś pierwszy raz się z nim spotkałeś. Co do porównywania XE2 do Lazarusa to bałbym się porównywać. Lazarus niewątpliwie wypada lepiej w kategorii cena jakość, a jeżeli chodzi o funkcjonalność to brakuje mu jeszcze wielu funkcji co prawda większość z nich jest taka że praktycznie się z nich nie korzysta (przynajmniej ja) ale jednak są, natomiast wsparcie dla wielu platform to jest to o czym w Delphi ciągle jeszcze można tylko pomarzyć. Zresztą co tu dużo mówić kto co lubi w tym pisze.
flowCRANE
No wiesz, to że ja jeszcze nie spotkałem się z takim formatem nie znaczy, że jest mało popularny; Ja pracowałem z niewielką ilością formatów (głównie tych najpopularniejszych z pełną obsługą jak *.bmp, *.ico, *.png), a czasem wykorzsytywałem swoje; Co do Lazarusa to oczywiste jest, że komercyjne oprogramowanie w 99% jest lepszej jakości niż jego darmowy odpowiednik, dlatego Lazarus'owi jeszcze dużo brakuje do XE2; Chociaż wieloplatformowość kodu przewyższa XE2 :)
K5
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 12 lat
  • Postów:30
0

Tak Pracuje na Delphi7.

Może przybliże o co dokładnie mi chodzi bo pisałeś wcześniej o bibliotece TPNGImage obsługujacej pliki PNG a nie PGM. Ciężko mi znaleźć jakąkolwiek bibilioteke obsługującą właśnie PGM . Zależy mi na tym formacie ponieważ łatwo mi tam pobrać wartości poszczególnych pikseli (wystarczy że wczytam jak zwykły plik tekstowy i mam Od razu dostęp do wspomnianych wartości pikseli ). Może orientujesz się czy mógłbym jakoś wczytać wartości pikseli z pliku PNG wtedy biblioteka TPNGImage byłaby dla mnie całkiem rozsądnym rozwiązaniem ?

flowCRANE
PNG się do tego nie nadaje;
KA
  • Rejestracja:prawie 20 lat
  • Ostatnio:minuta
  • Lokalizacja:Gorlice
1

Obrazki PGM możesz otwierać (nie tworzyć) wykorzystując ImageFileLib v.1.16 http://www.torry.net/authorsmore.php?id=4130 do obsługi obrazów tego typu potrzebna jest zewnętrzna biblioteka DLL JasPerLib.dll (zawarta w paczce).


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.
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
0

Zawsze możesz samemu napisać bibliotekę wczytującą takie pliki...


KA
Tam gdzie podałem są nawet źródła tylko że w C++
adf88
  • Rejestracja:ponad 21 lat
  • Ostatnio:prawie 12 lat
1

Z BMP też możesz czytać piksele "od razu", format pliku jest bardzo prosty.

edytowany 1x, ostatnio: adf88
K5
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 12 lat
  • Postów:30
0

Super! Wielkie dzieki !
Jeszcze tylko chciałbym sie dowiedzieć jak odczytać wartości poszczególnych pikseli z pliku PNG. (niekoniecznie w delphi chociaż byłoby fajnie )
Jeszcze bardziej naświetle problem. Z rendera otrzymuje obraz PNG 16bit. czyli każdy piksel reprezentowany jest przez wartość od 0 do 65000 z kawałkiem (dla obrazu czarno-białego)(chyba sie nie myle ??). Początkowo w IrfanView przerabiałem sobie plik do postaci PGM i miałem elegancki dostęp do pikseli jednakże IrfanView tworzył mi obraz 8bit czyli każdy piksel reprezentowany było wartością od 0 do 255 dla mojego projektu jest to zbyt mała rozpiętość ... Potrzebuje odczytać obraz 16bit.. Walczę już z tym od jakiegoś czasu z marnymi skutkami dlatego bardzo prosze o pomoc

@kAzek : Czy po użyciu tej biblioteki przez ciebie będę miał podgląd tego zdjecia pgm czy tylko wczytuje on bajt po bajcie bez poglądu ?
@kAzek : z tego co widze ta bibilioteka obsługuje również PNG czy to oznacza że będę miał dzieki niej dostęp do każdego piksela na obrazie ?

edytowany 4x, ostatnio: kozi555
1

Jeszcze tylko chciałbym sie dowiedzieć jak odczytać wartości poszczególnych pikseli z pliku PNG.

Masz rację, po co używać gotowej biblioteki, lepiej pisać od nowa coś czego nie umiesz napisać. Weź się zastanów nad tym co ty chcesz osiągnąć. Jak chcesz za wszelką cenę napisać swoją bibliotekę do odczytu PNG to googluj, ale podpowiem że to 'hardkorowe' dla newbie takiego jak ty (bo TBrain.active=false). A jak jednak się opamiętasz i odkryjesz to że istnieją gotowe biblioteki to też google.

K5
Gdybym nie potrzebował znać wartości każdego z pikseli to bym tu nie prosił o pomoc. Nie interesuje mnie wczytanie całego obrazka i wyświetlenie go za pomocą biblioteki. Potrzebuje mieć dostęp do poszczególnych pikseli. Plik PGM mi to bardzo ładnie umożliwia ale tak jak mówiłem problem jest w tym iż konwertując plik PNG 16bit za pomocą IrfanView do PGM to wartości pikseli i tak są z zakresu 0-255. Tak więc mój cel to odczyt poszczególnych pikseli z pliku w którym ich zakres to 0-65000 PNG lub PGM. I nie chcę za wszelką cenę pisać swoich bibliotek w tym celu.
K5
Możliwe że np istnieje narzędzie które pozwoli mi przekonwertować 16bitowy obraz PNG do 16 bitowego obrazu PGM. Tym sposobem również dałoby sie to zrealizować jednakże nic takiego nie znalazłem. Albo istnieje biblioteka pod delphi która umożliwi mi odczyt 16bitowych pikseli z obrazu. Inaczej nie umiem tego obejść dlatego własnie tu proszę o pomoc. Skoro mówisz że istnieje gotowa bibilioteka która umożliwi mi odczyt poszczególnych wartości pikseli z 16bitowego obrazu PNG to może mi podpowiesz.. Chyba że dla takiego MISTRZA programowania to zbytnia błahostka aby sie tym zająć
0

Gdybym nie potrzebował znać wartości każdego z pikseli to bym tu nie prosił o pomoc.

A co robią inne biblioteki? Czytają co drugi piksel? Możesz je przerobić do swoich potrzeb. Myślisz czasem?
Zresztą czy po wczytaniu nie można pobrać z TImage wartości wszystkich pikseli? Hmhm.

Skoro mówisz że istnieje gotowa bibilioteka która umożliwi mi odczyt poszczególnych wartości pikseli z 16bitowego obrazu PNG to może mi podpowiesz..

jasne! www.google.pl

Chyba że dla takiego MISTRZA programowania to zbytnia błahostka aby sie tym zająć

ja się tym umiem zająć, ale przecież to nie mnie uczymy tylko Ciebie. Nie mam potrzeby szpanowania, ostatnio zaspokoiłem ją szyfratorem relokacji ;) .
Użyj googla, wybierz jakąś bibliotekę PNG z źródłem i przerób ją tak żeby wypluwała ci kolejne piksele. Jak nie umiesz to może powinieneś zająć się czymś łatwiejszym?

flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 3 godziny
  • Lokalizacja:Tuchów
  • Postów:12167
0

@kozi555 - coś nie bardzo chyba wiesz jakiego formatu użyć; Najpierw piszesz o PGM, że wystarczy Ci obraz w skali szarości bo ma prostą budowę i ogólnie go chwalisz, a potem piszesz, że PNG też mógłby być;

Jednak te dwa formaty służą do trechę innych rzeczy, ten pierwszy obsługuje obrazy w skali szarości bez kanału alfa, zo to PNG obsługuje stopniowaną przezroczystość i 48-bitową głębię kolorów dla dowolnych obrazów RGB (a przy RGBA nawet 64 bity per piksel), dodatkowo zawartość jest bezstratnie kompresowana;

Zastanów się więc z którego formatu chcesz korzystać; Poza tym mylisz się, z podanej przeze mnie specyfikacji formatu PGM wynika, że na jeden piksel może składać się zarówno 8 bitów (jeśli wartość koloru mieści się w [0 .. 255]) lub 16 bitów (dla wartości od 256 do 65535):

PGM Format Specification napisał(a)
  1. The maximum gray value (Maxval), again in ASCII decimal. Must be less than 65536, and more than zero.

[...]

  1. A raster of Height rows, in order from top to bottom. Each row consists of Width gray values, in order from left to right. Each gray value is a number from 0 through Maxval, with 0 being black and Maxval being white. Each gray value is represented in pure binary by either 1 or 2 bytes. If the Maxval is less than 256, it is 1 byte. Otherwise, it is 2 bytes. The most significant byte is first.

stąd format zaoszczędza trochę pamięci;

Zanim zaczniesz cokolwiek kombinować to zastanów sie dobrze nad tym, z jakiego formatu chcesz skorzystać (dla początkującego dobrym sprawdzianem będzie *.pgm lub tak jak napisał @adf88 - *.bmp); Jak już zdecydujesz się to siadaj na Google i szukaj wszelkich dokumentacji wybranego formatu i czytaj, czytaj, czytaj... Inaczej w kółko będziesz wracał na forum i pytał o rzeczy, których można się dowiedzieć z sieciowych materiałów;

-123oho napisał(a)

Nie mam potrzeby szpanowania, ostatnio zaspokoiłem ją szyfratorem relokacji ;) .

No nie możliwe, pierwszy raz widzę Cię zadowolonego :]


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 2x, ostatnio: flowCRANE
adf88
  • Rejestracja:ponad 21 lat
  • Ostatnio:prawie 12 lat
0

W zasadzie BMP i PNG są bardzo podobne. Cechy wspólne:

  • obraz zapisywany binarnie w postaci bitmapy pikseli
  • możliwość stosowania różnych trybów (od 1bpp po ARGB* i palety)
  • kompresja bezstartna*

* W BMP można zapisać sobie kanał alfa. To jak zinterpretuje go program czytający plik zależy od niego. Zazwyczaj jest ignorowany.
* W przypadku PNG kompresja to standard. W BMP już gorzej, niby format pliku mówi o RLE ale nie wiem jakie jest wsparcie dla tego. Tak na prawdę to możemy sobie skompresować dane jak nam się żywnie podoba, kwestia interpretacji jest znowuż po stronie programu czytającego plik.

edytowany 5x, ostatnio: adf88
1
furious programming napisał(a):
-123oho napisał(a)

Nie mam potrzeby szpanowania, ostatnio zaspokoiłem ją szyfratorem relokacji ;) .

No nie możliwe, pierwszy raz widzę Cię zadowolonego :]

Przepraszam :P . Nie od razu może 'zadowolony', ale oejku coś pozytywnego napisałem. Zdarza mi się, sorry :P .

flowCRANE
Masz plusa na zachętę :P
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 3 godziny
  • Lokalizacja:Tuchów
  • Postów:12167
0
adf88 napisał(a)
  • W BMP można zapisać sobie kanał alfa. To jak zinterpretuje go program czytający plik zależy od niego. Zazwyczaj jest ignorowany.

Ja jeszcze nie widziałem programu, który podczas odczytu zwraca uwagę na ten kanał... Mogę się myslić, ale dawniej jak korzystałem z Photoshop'a to też nie obsługiwał go; Dziwne, bo skoro jest taka możliwość to dlaczego tego się nie stosuje? Dlaczego najpopularniejsze programy graficzne nie interpretują go...? Badań nie przeprowadzałem, grafikiem nie jestem, ale naprawdę nie spotkałem jeszcze takiego edytora...

adf88 napisał(a)

Tak na prawdę to możemy sobie skompresować dane jak nam się żywnie podoba, kwestia interpretacji jest znowuż po stronie programu czytającego plik.

Właśnie, zawsze można zapisać sobie grafikę przez standardowo zaimplementowane funkcje, a po zapisie skompresować plik, nawet własnymi narzędziami; Jednak pisząc własny program do wyświetlania/edycji grafik warto samemu napisać obsługę danego formatu (jeśli oczywiście czuje się na siłach);


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
Patryk27
O ile mi wiadomo, BMP można także animować. Inna sprawa, że nie spotkałem się z programem, który to obsługuje.
flowCRANE
Tego też nie wiedziałem; Nigdy nie była mi potrzebna taka wiedza :P
0

a jeszcze nie widziałem programu, który podczas odczytu zwraca uwagę na ten kanał... Mogę się myslić, ale dawniej jak korzystałem z Photoshop'a to też nie obsługiwał go; Dziwne, bo skoro jest taka możliwość to dlaczego tego się nie stosuje? Dlaczego najpopularniejsze programy graficzne nie interpretują go...?

Z tego co się orientuję to na początku te pola były reserved i nigdy nie wprowadzono rozszerzenia które mówiłoby jednoznacznie że tu zawsze jest alfa. Zastąpiono to lepszymi formatami które wspierały kompresje etc. .

O ile mi wiadomo, BMP można także animować. Inna sprawa, że nie spotkałem się z programem, który to obsługuje.

A jak zrobię swoje rozszerzenie które będzie BMP zamieniać w modele 3d? To nagle się okaże że BMP jest formatem modeli? No właśnie nie, bo to że ktoś coś zrobił nie znaczy wcale że jest to szeroko używane/rozpoznawane przez programy. Nigdy nie spotkałem się z animowanym BMP co świadczy o tym że takie coś nie jest używane - a jak coś nie jest widoczne ale chodzą o tym słuchy to to jest legenda...

Patryk27
Rzeczywiście, legenda: http://technet.microsoft.com/en-us/library/dd361868.aspx ... Ogólnie "animated bmp" wyświetla sporo różnych artykułów.
flowCRANE
"A jak zrobię swoje rozszerzenie które będzie BMP zamieniać w modele 3d?" - Twoja magia nie zna granic!
0

Rzeczywiście, legenda: http://technet.microsoft.com/en-us/library/dd361868.aspx ... Ogólnie "animated bmp" wyświetla sporo różnych artykułów.

W googlach można znaleźć także legendy :) . Wszyscy dzisiaj używają animowanych GIFów.

flowCRANE
No bo GIF'y do tego służą i są bradzo popularne :)
K5
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 12 lat
  • Postów:30
0

@furious programming Mówiłes żebym sie zastanowił z jakiego formatu pliku mam korzystać. Otóż nie mam za bardzo sie nad czym zastanawiać ponieważ w programie do Grafiki 3D renderuje sobie obraz formatu PNG - 16bit. Jest to jedyny format pliku 16bitowy czyli taki o jaki mi chodzi. No i teraz zaczyna się problem ponieważ z tego pliku potrzebuje wartości poszczególnych pikseli (będą to wartości z zakresu 0 - 65000 z kawałkiem . Chyba się nie myle ? Jak tak to mnie poprawcie ). @-123oho wspomniał iż istnieją biblioteki do wczytania pliku PNG do komponentu TImage i z tamtego komponentu będę mógł wyciągnąć te piksele (dalej mówimy tu o wartościach od 0 do 65000 z kawałkiem ) i wczytać je do tablicy dwuwymiarowej np 650 x 650 zgodnie z rozdzielczością obrazka ? Jeżeli tak to jestem w domu. I tak będę to próbował robić.

Jeżeli nie to pozostawałaby mi tylko przekonwertować plik PNG na PGM no i stamtąd prościutko już można odczytać te wartości. Tylko że przekonwertowany plik PGM musiałby być 16bitowy. A nigdzie w sieci nie znalazłem programu który by to potrafił ( PNG16bit na PGM16bit).

Gdybyście coś doradzili nt. tego co własnie w tym wypadku mam robić to będę wdzięczny :))

Aha no i jeszcze wcześniej trzeba by było zamienić go tak by był to obraz w skali szarości prawda ?

Ajjjj... Mam już prawie ukończony program, a z tym sobie rady dać nie mogę ...

edytowany 3x, ostatnio: kozi555
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 3 godziny
  • Lokalizacja:Tuchów
  • Postów:12167
1
kozi555 napisał(a)

No i teraz zaczyna się problem ponieważ z tego pliku potrzebuje wartości poszczególnych pikseli (będą to wartości z zakresu 0 - 65000 z kawałkiem . Chyba się nie myle ? Jak tak to mnie poprawcie ). @-123oho wspomniał iż istnieją biblioteki do wczytania pliku PNG do komponentu TImage i z tamtego komponentu będę mógł wyciągnąć te piksele (dalej mówimy tu o wartościach od 0 do 65000 z kawałkiem )

Czy Ty naprawdę uważasz, że ja nie wiem co to jest typ Word (wspomniana liczba 16-bitowa)...? Otóż istnieją biblioteki tak samo jak instalowalne kontrolki - po instalacji możesz śmiało pakować obrazy *.png do zwykłego TImage (jeśli nadal korzystasz z Delphi 7 - nowsze środowiska w pełni obsługują ten format);

kozi555 napisał(a)

i wczytać je do tablicy dwuwymiarowej np 650 x 650 zgodnie z rozdzielczością obrazka ?

No to trzeba trochę poczytać o tym, w jaki sposób się to robi; Ja do samego odczytania szerokości i wysokości obrazu używałem takiego kodu:

Kopiuj
procedure GetPNGDimensions(const sFileName: String; var wWidth, wHeight: Word);

  function ReadMWord(fsFile: TFileStream): Word;
  type
    TMotorolaWord = record
      case Byte of
        0: (Value: Word);
        1: (Byte1, Byte2: Byte);
    end;
  var
    MW: TMotorolaWord;
  begin
    fsFile.Read(MW.Byte2, SizeOf(Byte));
    fsFile.Read(MW.Byte1, SizeOf(Byte));

    Result := MW.Value;
  end;

type
  TPNGSig = array [0..7] of Byte;
const
  ValidSig: TPNGSig = (137, 80, 78, 71, 13, 10, 26, 10);
var
  Sig: TPNGSig;
  fsFile: TFileStream;
  I: Integer;
begin
  FillChar(Sig, SizeOf(Sig), #0);
  fsFile := TFileStream.Create(sFileName, fmOpenRead);

  try
    fsFile.Read(Sig[0], SizeOf(Sig));

    for I := Low(Sig) to High(Sig) do
      if Sig[I] <> ValidSig[I] then Exit;

    fsFile.Seek(18, 0);
    wWidth := ReadMWord(fsFile);

    fsFile.Seek(22, 0);
    wHeight := ReadMWord(fsFile);
  finally
    fsFile.Free;
  end;
end;

Jeżeli potrzebujesz wpakować kolory pikseli do macierzy dwuwymiarowej to musisz jeszcze trochę poczytać na temat tego formatu;

kozi555 napisał(a)

Tylko że przekonwertowany plik PGM musiałby być 16bitowy. A nigdzie w sieci nie znalazłem programu który by to potrafił ( PNG16bit na PGM16bit).

Ile razy jeszcze będę Ci powtarzać, że ten format plików graficznych obsługuje 16-bitowe kolory szarości...? Jeszcze raz przekleję słowa ze specyfikacji:

PGM Format Specification napisał(a)
  1. The maximum gray value (Maxval), again in ASCII decimal. Must be less than 65536, and more than zero.

[...]

  1. A raster of Height rows, in order from top to bottom. Each row consists of Width gray values, in order from left to right. Each gray value is a number from 0 through Maxval, with 0 being black and Maxval being white. Each gray value is represented in pure binary by either 1 or 2 bytes. If the Maxval is less than 256, it is 1 byte. Otherwise, it is 2 bytes. The most significant byte is first.

i dopiska na dole specyfikacji:

Compatibility napisał(a)
  • Before April 2000, a raw format PGM file could not have a maxval greater than 255. Hence, it could not have more than one byte per sample. Old programs may depend on this.

co oznacza, że do kwietnia 2000 r. każdy piksel opisany jest na jednym bajcie - po tej dacie tak jak napisałem wcześniej - jeżeli wartość koloru nie przekracza 255 - kolor opisany będzie jednym bajtem (typ Byte), w przeciwnym razie (czyli wartość od 256 do 65535) dwoma bajtami (typ Word); Zrozumiano...? Albo ta specyfikacja jest błędna, albo ja jestem ślepy...

Co prawda specyfikacja ta jest z 2003 roku, jednak na wikipedii artykuł o tym formacie jest sprzed kwietnia 2000 roku i jest napisane, że każdy piksel opisany jest na jednym bajcie; Skoro napisane jest jasno, że kolor może mieć wartość taką, jak typ Word stąd jasne jest, że grafika zapisana w tym formacie może byc 16-bitowa (lub skompresowana 8-bitowa);


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 3x, ostatnio: flowCRANE
flowCRANE
@kozi555 - patrząc na Twoje posty powątpiewam, że jesteś w stanie napisać taki program bez gruntowego przeczytania dobrego kursu...
K5
hmmm... no to się zdziwisz...
flowCRANE
Oby pozytywnie :)
adf88
"jeżeli wartość koloru nie przekracza 255 - kolor opisany będzie jednym bajtem" - hmm, na zapisu koloru o wartości 255 potrzebuję 4 bajty bajty (spacja + jedna cyfra 2 + dwie cyfry 5)
flowCRANE
A spacja po co? :P
adf88
  • Rejestracja:ponad 21 lat
  • Ostatnio:prawie 12 lat
1
kozi555 napisał(a):

w programie do Grafiki 3D renderuje sobie obraz formatu PNG - 16bit. Jest to jedyny format pliku 16bitowy czyli taki o jaki mi chodzi. No i teraz zaczyna się problem ponieważ z tego pliku potrzebuje wartości poszczególnych pikseli (będą to wartości z zakresu 0 - 65000 z kawałkiem . Chyba się nie myle ? Jak tak to mnie poprawcie ). @-123oho wspomniał iż istnieją biblioteki do wczytania pliku PNG do komponentu TImage i z tamtego komponentu będę mógł wyciągnąć te piksele (dalej mówimy tu o wartościach od 0 do 65000 z kawałkiem ) i wczytać je do tablicy dwuwymiarowej np 650 x 650 zgodnie z rozdzielczością obrazka ? Jeżeli tak to jestem w domu. I tak będę to próbował robić.

Komponent TImage służy do wyświetlania obrazów. Ty potrzebujesz co innego. Użyj bitmapy BMP. Jeśli program potrafi eksportować obrazy do PNG to do BMP też potrafi. W Delphi od zarania dziejów istnieje klasa która potrafi wczytać BMP umieszczając wszystkie piksele w tablicy, nazywa się TBitmap. Do odczytu konkretnych pikseli używa się metody ScanLine.

edytowany 6x, ostatnio: adf88
K5
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 12 lat
  • Postów:30
0

@adf88 : Masz racje render potrafi wyeksportować do BMP jednakże nie mogę wtedy zaznaczyć opcji 16 bitowej co jest w moim przypadku rzeczą konieczną... Chyba że może masz na to jakiś sposób ?

edytowany 1x, ostatnio: kozi555
adf88
  • Rejestracja:ponad 21 lat
  • Ostatnio:prawie 12 lat
1

To użyj innego edytora, tym razem grafiki rastrowej, otwórz PNG i zapisz w formacie BMP 16bpp grayscale.

edytowany 2x, ostatnio: adf88
K5
A wiesz może który edytor to potrafi ?
adf88
Na pewno Phothoshop lub GIMP. Może Paint da radę?
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 3 godziny
  • Lokalizacja:Tuchów
  • Postów:12167
0
kozi555 napisał(a)

Masz racje render potrafi wyeksportować do BMP jednakże nie mogę wtedy zaznaczyć opcji 16 bitowej co jest w moim przypadku rzeczą konieczną...

Piszesz tak, jakbyś chciał zautomatyzować tworzenie tego obrazu (po zakończeniu renderowania Twój program automatycznie wykrywa plik i go otwiera); Ile masz tych grafik? W jaki posób chcesz wykorzystywać te pliki?

Jeśli musisz sobie tylko przygotować zestaw obrazów, które dopiero po skończeniu chcesz wykorzysatać w programie to oczywiste jest, że należy wyeksportować model do jakiegoś formatu pośredniego, a następnie otwierać wszystkie pliki w edytorze graficznym i zapisywać już we właściwym formacie; Wtedy będziesz miał elegancko przygotowane grafiki i nie będziesz musiał kombinować, czego jak na razie nie mogę zrozumieć; Chyba, że chcesz napisać program, który będzie Ci konwertował format pośredni do wynikowego, to już inna sprawa;

adf88 napisał(a)

Może Paint da radę?

Na WinXP jest słaby ten M$ Paint, obsługuje:

Nazwa filtru Głębia
Mapa bitowa monochromatyczna 1-bitowa
Mapa bitowa 16-kolorowa 4-bitowa
Mapa bitowa 256-kolorowa 8-bitowa
Mapa bitowa 24-bitowa 24-bitowa
Może na Win7 posiada więcej możliwości;
Patryk27 napisał(a)

O ile mi wiadomo, BMP można także animować. Inna sprawa, że nie spotkałem się z programem, który to obsługuje.

Owszem, można:

Wikipedia napisał(a)

Animowane bitmapy – powstają z cyklicznej podmiany kolorów w palecie, przykładem może być logo startowe systemu Windows. Animowane bitmapy można tworzyć dla obrazów 8-bitowych.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 4x, ostatnio: flowCRANE
adf88
  • Rejestracja:ponad 21 lat
  • Ostatnio:prawie 12 lat
0

Dokładnie. Na razie strzelamy w ciemno. Jakbyś opisał ogólne ogólności byłoby łatwiej, co chcesz osiągnąć. Piszesz, że 16bpp grayscale jest jedynym dopuszczalnym formatem, ale dlaczego?

flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 3 godziny
  • Lokalizacja:Tuchów
  • Postów:12167
0
adf88 napisał(a)

Piszesz, że 16bpp grayscale jest jedynym dopuszczalnym formatem, ale dlaczego?

Mi się wydaje, że obrazy są w skali szarości i potrzebuje łatwo odczytać kolory poszczególnych pikseli (format PGM się nadaje do tego), przy czym obraz musi być dobrej jakości - stąd musi być z głębią 16-bitową;


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 1x, ostatnio: flowCRANE
K5
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 12 lat
  • Postów:30
0

To co chce osiągnąć to wczytać do programu obraz (uzyskany z rendera - PNG 16bit) i odczytać jasności każdego z pikseli (mogę użyć do tego jakichś innych programów które mi przetworza obraz do formatu wynikowego który będę mógł wczytać prosto w Delphi - w tym przypadku stanęło na BMP 16bit w skali szarości).

A dlatego musi być to obraz 16bitowy ponieważ potrzebuję dużą rozpiętość jasności poszczególnych pikseli

edytowany 1x, ostatnio: kozi555
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 3 godziny
  • Lokalizacja:Tuchów
  • Postów:12167
0
kozi555 napisał(a)

mogę użyć do tego jakichś innych programów które mi przetworza obraz do formatu wynikowego który będę mógł wczytać prosto w Delphi - w tym przypadku stanęło na BMP 16bit w skali szarości).

Dlaczego stanęło na BMP 16-bit w skali szarości? Czy ta skala szarości jest Ci potrzebna bo obraz jest w niej wykonany, czy może być kolor? Bo jeśli tak, to można przecież skorzystać z BMP 24-bit; Jeżeli koniecznie chcesz mieć skalę szarości i 16-bitową gamę to skorzystaj z *.pgm z tym, że albo zaopatrzysz się w dodatkową bibliotekę/rozszerzenie do kontrolki TImage albo ręcznie odczytuj linie z pliku i pakuj do np. TBitmap i wyświetlaj w komponencie;

Nie wiem dalej, czy chcesz tylko obrobić odpowiednio ten obraz, czy zależy Ci także na jego wyświetleniu w kontrolce TImage; Jeżeli nie chcesz go wyswietlać, to nie korzystaj z kontrolki, bo po co; Komponenty służą do przedstawiania użytkownikowi jakichś informacji, a nie do jej modyfikacji (było już nie raz to poruszane, jak ktoś pakował do TMemo tysiące linii tylko po to, by je jakoś tam pozmieniać co jest głupotą - traci się o wiele na szybkości, a zajętość pamięci wzrasta diametralnie);

kozi555 napisał(a)

A dlatego musi być to obraz 16bitowy ponieważ potrzebuję dużą rozpiętość jasności poszczególnych pikseli

16-bitowa grafika nie posiada znowu aż tak dużej rozpiętości, sam PNG może posiadać (z najwyższych głębi) 48-bitową dla RGB lub 64-bitową dla RGBA (z kanałem alfa) - to jest dopiero rozpiętość;


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
K5
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 12 lat
  • Postów:30
0

Tak zależy mi na wyświetleniu tego obrazu w komponencie. Bardzo chętnie bym skorzystał z 16bitowego formatu PGM tylko nie wiem w jaki sposób przerobić format PNG 16bit do PGM 16bit - nie znalazłem żadnego programu w sieci który by to umiał albo źle szukałem. Gdy wpakowałem PNG 16 bit do IrfanView i zapisałem jako PGM to zapisał mi on ten obraz jako 8-bitowy . Wartości poszczególnych pikseli były od 0-255.

edytowany 2x, ostatnio: kozi555
K5
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 12 lat
  • Postów:30
0

Zainstalowałem bibliotekę TPNGImage i wczytałem obraz PNG 16 bitowy w ten sposób :
procedure TBRDFConv.btnWczytajClick(Sender: TObject);

Kopiuj
 
var PNG: TPNGObject;
    BMP: TBitmap;
    TF : TextFile;
    f:pbytearray ;


begin
   OpenDialog1.Execute   ;
   PNG := TPNGObject.Create;
   BMP := TBitmap.Create;
   PNG.LoadFromFile(OpenDialog1.FileName);
   BMP.Assign(PNG);
   Image1.Picture.Bitmap := BMP;
   f:=bmp.scanline[0];
   f[0]:= f[0] - $F;
   BMP.Free;
   PNG.Free;
end;

Poodczytywałem sobie wartości paru pixeli z tego obrazu i dalej są to wartości z zakresu 0 -255... :/ Ktoś mi powie dlaczego tak się dzieje?

adf88
  • Rejestracja:ponad 21 lat
  • Ostatnio:prawie 12 lat
1

Przy konwersji do BMP tracisz 16bpp. Użyj Scanline i ExtraScanline na obiekcie TPNGObject.

flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 3 godziny
  • Lokalizacja:Tuchów
  • Postów:12167
0

Nie wiem, czy autor prawidłowo wykorzystuje metodę ScanLine;
Coś mi nie pasuje ta macierz f:pbytearray; i wywołanie funkcji f:=bmp.scanline[0];;

Sugerując się rozsądkiem i artykułem How to use ScanLine's z Embarcadero macierz nie powinna być typu Byte...

Jak się mylę to mnie poprawcie :]


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 2x, ostatnio: flowCRANE
adf88
  • Rejestracja:ponad 21 lat
  • Ostatnio:prawie 12 lat
1

W przykładzie jest tablica rekordów po 4 bajty (packed):

Kopiuj
  TRGB32 = packed record
    B, G, R, A: Byte;
  end;

więc możemy jej używać również jak zwykłej tablicy bajtów.

flowCRANE
No tak, czyli to by się zgadzało;
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)