Jak zwrocic obrazek?

0

Witam,

Oto moj problem, wiem ze odeslecie mnie do google, probowalem i ciezko to znaleŹĆ bo zagadnienie jest niecodzienne:

Widzialem na wielu stronkach dynamiczne obrazki, np "przepisz kod z obrazka", lub "obrazkowy licznik odwiedzin". Wydedukowalem ze tworzy je CGI, ktore wywoluje zewnetrzy program, ktory na swoim wyjsciu zapodaje gifa, jpga, pnga. Chcialbym stworzyc wlasnie cos takiego w windowsowym srodowisku apache+cgi+delphi. Utknolem na etapie stworzenia konsolowego programu w delphi, ktory po wywolaniu z jakims parametrem wykonalby jakies operacje i zwrocil plik jpg...

Niechce zapisywac tego jpga z delphi do pliku, chce go zwrocic do cgi, ktory to przesle apachem. Chce ominac rozwiazania typu "zapisz to gdzies w tymczasowym katalogu a potem apache sobie to otworzy".

Czy ktos wie jak to zrobic?

0

Na ogół nie robi tego zewnętrzny program tylko skrypt, na przykład PHP, w locie od razu zwracający na wyjście binarną treść obrazka (w PHP do takich rzeczy jest biblioteka GD; bez względu na to czy PHP instalowany jako CGI czy ISAPI).

Całość odbywa się bez zapisu na dysku, tylko bezpośrednio na wyjście do podłączonego przez HTTP klienta.

0

wykorzystaj biblioteke GD dla php

0

wiem ze jest wiele rozwiazan, ale mi naprawde zalezy na tym zeby przerobke obrazka dokonywal exek z delphi... to czesc wiekszego systemu, ktorego jedynym zadaniem nie bedzie tylko preparowanie jpegow, mam wrazenie ze nie wystarczy php+jakas biblioteka. wiadomo ze moge jakos to obejsc i z php wywolac sobie program, a jpega przerabiac osobno dzieki gd, ALE:

chociazby ze wzgledow edukacyjnych: czy jest mozliwe zwrocenie na wyjsciu obrazka jpg? wiem ze istnieje program FLY ktory cos takiego robi, jest wykorzystywany przy wielu cgi...

Ale czy da sie to zrobic w delphi?

0
uses
  Windows, Graphics, JPEG, Classes;

var Bitmap:TBitmap;
    Stream:TMemoryStream;
    Written:DWORD;
begin
Bitmap:=TBitmap.Create();
with Bitmap do
  try
    Width:=100;
    Height:=32;
    Canvas.TextOut(10, 10, 'Hello world!');
    with TJPEGImage.Create do
      try
        Assign(Bitmap);
        Stream:=TMemoryStream.Create;
        try
          SaveToStream(Stream);
          Stream.Position:=0;
          WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), PByte(Stream.Memory)^, Stream.Size, Written, nil);
        finally
          Stream.Free;
          end;
      finally
        Free;
        end;
  finally
    Free;
    end;
end.
0

zaraz przetestuje i jesli to dziala to jestes mistrzem w dodatku takim, ktoremu zajelo to 5 minut, szczawnik :D

0

Niestety, program podany przez Szczawika nie do konca dziala...

kompiluje sie fajnie i przechodzi test run, przy odpaleniu dwukrotnym kliknieciem z windowsa wyswietlo duzo ciekawych znaczkow (wprawny haker taki jak ja ^^ poznaje bez trudu ze to obrazek jpg, a nawet jest w stanie odczytac hello world bo dekompresuje to w oczach ;P )po czym okienko cmd sie zamyka.

Jednakze: jesli wlaczy sie cmd i uruchomi "obrazek.exe > test.jpg", windows szybko reaguje na te probe uprzejmie zwracajac nasza uwage na to ze program wykonal nieprawidlowa operacje i nastapi jego zamkniecie, a dla prawdziwych hakerow dodatkowo dodaje kilka szczegolow, jak np.

Exception EAccessViolation in module kernel32.dll at 00011024. Access violation at address 7C811024 in module 'kernel32.dll'. Write of address 00000000.

I kazdy haker juz wie o co chodzi. No moze oprocz mnie.

NAJCIEKAWSZE: gdy program ten uruchamiam jako cgi wywolujac go z przegladarki, apache ladnie zapodaje DOBRY rysunek (az do ostatniego pixela) po czym winda ponownie daje o sobie znac, jakby chciala powiedziec "to ze masz apacza, mysqla, interpreter php i perla to nie znaczy ze jestes na linuxie, sam popatrz, tu masz runtime error ode mnie w prezencie"...

Szczawik'u, czy jest na to jakas rada? mi ten kod wydaje sie dobry, na tyle krotki ze w zasadzie NIE MA gdzie popelnic bledu... a jednak... mysle ze jak juz cos, to bedzie gdies przy pisaniu na streama...

Pozdro i z gory dzieki za odpowiedz

0

przepraszam za posty jeden pod drugim...

jesli to pomoze w rozwiazaniu problemu: zauwazylem ze przy ladowaniu obrazka w przegladarce (dalem sobie wiekszy obrazek bo na malym bym tego nie zauwazyl), blad windowsa pojawia sie tuz przy samym koncu, kilka linijek pikseli przed koncem obrazka. Wtedy klikam ze zapoznalem sie z bledem i ladowanie dokancza sie... to jest na 100% cos przy pisaniu do streama, tylko ze ta linijka wyglada calkiem normalnie...

mam nadzieje ze ktos na cos wpadnie, bo problem jest denerwujacy wlasnie dlatego ze nie wiadomo co jest zle.

mysle ze ewentualnym rozwiazaniem byloby uzycie jakiejs innej metody pisania na streama, jest jakas?

0

Ciekawe, by mi nie udało się ani razu uzyskać AV :/ Bez względu na sposób wywołania, wliczając jako CGI w Apache oraz IIS.

Poprawiłem powyższy kod, sprawdź teraz.

0

moge zapodac jakies screenshoty ale to niezbyt mnie uwiarygodni, mozecie tylko uwierzyc... Problem nie lezy w apachu, bo binarka wysypuje sie odpalana sama z siebie... co ciekawe, tylko przy przekierowywaniu wyjscia do pliku, bo gdy wypisuje na konsole obrazek 1024 x 768 (a zajmuje to z 3 sek) to jedynym dziwnym objawem jest to ze na koniec zanim cmd wyswietli znowu "c:\" jest kilkusekundowy freeze okna cmd...

moze problem jest gdzies w delphi? ja mam 7 personal (darmowa, kilkadziesiat mb z oficjalnej stronki)... prosze napisz jaka ty masz wersje i udostepnij gdzies binarke skompilowana przez ciebie, a ja wtedy wrzuce gdzies swoja...

w miedzyczasie: czy mozna jakos zastapic to linijke kodu co wypisuje stream na wyjscie korzystajac z writefile()? bo bycmoze to cos da, jestem prawie pewien ze wlasnie gdzies w tamtym momencie jest blad... probowalem to przepisac uzywajac bufora po 1000 bajtow ale chwytalem jakies dziwne bledy i dalem za wygrana, widocznie jestem jeszcze zbyt noobowy :P

czekam na odp i wrzucona gdzies twoja binarke :)

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