[ borovac @ 12.08.2005. 14:45 ] @
Imam dva bitmap-a. Trebam naći razliku, tj. trebam u novi bitmap upisati ono što se promijenilo u drugom u odnosu na prvi.
Pravi screen capture više puta. Sada želim da samo prvi capture bude pun, dok u ostalim upicujem samo promjene.
Da li ovo može riješiti bez testiranja pixel po pixel??
[ obucina @ 12.08.2005. 20:15 ] @
Radis neku video kompresiju?
Ne moze, moras testirati piksel po piksel.
Cak je ovo i najbrzi nacin.
[ borovac @ 13.08.2005. 14:44 ] @
Radim kompresiju.
Pravim screen capture npr. svakih 50 ms, tako da bi sačuvao prostora moram ovo raditi.
Možel malo pomoći oko PixelPoPixel metode.
Kako napravit da u nekoj slici ne ćelim da neki pixel sadrži informacije o boji?
Konto sam da taj pixel narpavim bijem i onda sliku postavim na transparent?
Ali me zanima da li neki pixel može da ne sadrži nikakvu boju.
[ reiser @ 13.08.2005. 16:12 ] @
Pa ako ne sadrzi "nikakvu boju" onda je taj pixel crn, zar ne :>>
[ borovac @ 13.08.2005. 16:15 ] @
To si u pravu.
Znači trebam sve pixele koji mi netrebaju naštimat na crno.
[ obucina @ 14.08.2005. 05:32 ] @
Uzmes boju piksela sa jedne slike i uzmes boju piksela sa druge slike i oduzmes ih.

Novu sliku dobijas tako sto ovu razliku dodas na prvu sliku.

U pseudo kodu

for x
for y
razlika(x, y) = slika2(x, y) - slika1(x, y)


for x
for y
slika2(x, y) = slika1(x, y) + razlika(x, y)

razlika nije druga slika, vec niz vrednosti koje predstavljaju razliku izmedju dve slike, a koja moze biti i negativna (npr beli piksel postane crn), za razliku od vrednosti boje piksela koja je uvek pozitivna. razlika ce obicno sadrzati male brojeve i nule a to moze dobro da se kompresuje.
[ borovac @ 14.08.2005. 20:15 ] @
Evo kako sam ja to uradio
Code:

procedure TForm1.Button1Click(Sender: TObject);
var
  i,j,w,h:integer;
  bmp1,bmp2,bmp3:TBitmap;
  JPGImage:TJpegImage;
begin
// bmp1 i bmp2 imam na hard disku i njih otvaram
// bmp3 mi predtavlja razliku bmp1 i bmp2, tj. sve one pixele koji se nalaze u bmp2 a kojih nema u bmp1
bmp1:=TBitmap.Create;
bmp2:=TBitmap.Create;
bmp3:=TBitmap.Create;
bmp1.LoadFromFile('c:\pic1.bmp');
bmp2.LoadFromFile('c:\pic2.bmp');
w:=bmp1.Width;
h:=bmp1.Height;
bmp3.Width:=w;
bmp3.Height:=h;
for i:=1 to w do
    for j:=1 to h do
      begin
        //bmp3.Canvas.Pixels[i,j]:=0;
        if bmp1.Canvas.Pixels[i,j]<>bmp2.Canvas.Pixels[i,j] then
          bmp3.Canvas.Pixels[i,j]:=bmp2.Canvas.Pixels[i,j]; // ovdje računa razliku
      end;
// konvertujem bmp3 u jpg da bi bio mnogo, mnogo manji
JPGImage:=TJpegImage.Create;
JPGImage.Assign(bmp3);
JPGImage.CompressionQuality:=75;
JPGImage.Smoothing:=True;
JPGImage.SaveToFile('c:\pic3.jpg');
bmp3.SaveToFile('c:\pic3.bmp');
// prikazujem sva tri bitmapa na formi
Image1.Picture.Bitmap:=bmp1;
Image2.Picture.Bitmap:=bmp2;
Image3.Picture.Bitmap:=bmp3;
end;


Pogledaj gore onu liniju
Code:
bmp3.Canvas.Pixels[i,j]:=0;

Kada nju uključim slika bude veća. Znači ako je slika bijela onda je veća.

Eh sada recimo da imam samo bmp1 i bmp3 (nemam bmp2).
Trebam da dobijem bmp2
To mi ne ide. Igleda da bmp3 ondje gdje ne treba ništa prikazati prikazuje bijelu.

Možda da pravim matricu razlika po pixelima. Kako proširivati dimenzije matrice dinamički, i kako zapravo snimiti tu matricu u fajl?
[ borovac @ 14.08.2005. 23:43 ] @
Bio si u pravu, bolja je kompresija kada praviš razliku vrijednosti pixela.
Code:

for i:=0 to w-1 do
  for j:=0 to h-1 do
    bmp3.Canvas.Pixels[i,j]:=bmp1.Canvas.Pixels[i,j] - bmp2.Canvas.Pixels[i,j];

Code:

for i:=0 to w-1 do
  for j:=0 to h-1 do
     bmp2.Canvas.Pixels[i,j]:=bmp1.Canvas.Pixels[i,j] - bmp3.Canvas.Pixels[i,j];

Međutim i ovdje imam nekih problema, neki pixeli ne budu iste boje nakon povratka slike.
[ obucina @ 15.08.2005. 11:34 ] @
Rekoh ti da razlika nije nova slika, kao sto ti ovde radis, vec samo matrica. Razlika moze da bude negativna, a piksel je UVEK pozitivan. Tu ti je greska, zbog koje ne dobijas iste boje piksela.

Citaj u helpu o dinamickim nizovima za menjanje velicine matrice, o radu sa fajlovima za snimanje matrice u fajl, a kompresiju nemoj raditi jpeg-om, posto ne kompresujes sliku vec matricu razlika izmedju dve slike. Koristi bilo koji algoritam za kompresiju, imas zlib uz Delphi, a imas i free komponente za kompresiju (zip, lzh). Guglaj...
[ borovac @ 15.08.2005. 13:04 ] @
OK, i ja sam mislio da pixel ne može biti negativan ali sam onda vidio da je TColor deklarisan na slijedeći način
Code:
TColor = -$7FFFFFFF-1..$7FFFFFFF;

Poslušat ću tebe.
[ borovac @ 15.08.2005. 14:23 ] @
Evo napravio sam matricu
Code:

var
  MBitmap:array of array of integer;

w:=bmp1.Width;
h:=bmp1.Height;
SetLength(MBitmap,w,h);
for i:=0 to w-1 do
  for j:=0 to h-1 do
    MBitmap[i,j]:=bmp1.Canvas.Pixels[i,j]-bmp2.Canvas.Pixels[i,j];

Kako sada to snimiti u fajl?
Hoćul u textualni, ili nešto drugo??
[ obucina @ 15.08.2005. 23:59 ] @
Topic u Helpu je File Types

Vazne stvari su
Fajl: file of integer;
AssignFile, Reset, Write

Prvo upisujes visinu i sirinu slike, a zatim piksele.