Entwickler-Ecke

Ankündigungen - AGS 2009 - Tipps/Lösung zu Gewinnspiel 3


Christian S. - Mi 16.12.09 00:11
Titel: AGS 2009 - Tipps/Lösung zu Gewinnspiel 3
Hallo!

Folgend ein Tipp zu Gewinnspiel 3 ("3D-Film"):


Ich hoffe, es hilft dem ein oder anderen auf die Sprünge :-)

Grüße
Christian


Niko S. - Mi 16.12.09 08:40

Farbe?
Na toll, nun ist das genau das umgekehrte von dem was ich gesagt hätte -> nämlich keine Farbe (nur SW)...
Jetzt, bin ich wieder am Anfang bei einer Datei wo komisches Zeug drin steht, was keiner versteht.


Flamefire - Mi 16.12.09 12:41

Ich find das lustig. Ich lös die Aufgaben immer ohne Tip, dann kommt der Tip und ich hab keine Ahnung, was ich damit hätte anfangen soll ;-)


Niko S. - Mi 16.12.09 14:38

Gibts vielleicht irgendwelche Topics oder so die solche Thematiken behandeln, weil ich habe echt 0 plan wie sowas aussehen soll...
Und ein BMP sieht auch anders aus als das was ich da nun drin habe ...


Noob23 - Mi 16.12.09 14:53

user profile iconNiko S. hat folgendes geschrieben Zum zitierten Posting springen:
Gibts vielleicht irgendwelche Topics oder so die solche Thematiken behandeln, weil ich habe echt 0 plan wie sowas aussehen soll...
Und ein BMP sieht auch anders aus als das was ich da nun drin habe ...


Es ist ja kein BMP sondern ein Film ;)


Niko S. - Mi 16.12.09 15:38

Und ein Film besteht aus mehreren Bildern, folglich sind dort einfach mehrere Bilder hintereinander ...
Frage: Wieviel Bytes hat nun ein Bild? & Wie Les ich die Bilder aus..
Oder lieg ich da etwa falsch?


Flamefire - Mi 16.12.09 16:25

Nein du liegst richtig. Und genau darin liegt ja das Rätsel.

PS: Vorsicht mit solchen Äußerungen, kann schon als Tip gewertet werden.

Die Rätsel sind aber meist so, dass man erst das Problem suchen, lösen und dann in der Lösung noch eine Frage beantworten muss.


Boldar - Mi 16.12.09 16:46

Mhhh, also ich kann mit dem Tipp so garnichts anfangen...


Niko S. - Mi 16.12.09 16:51

So okay der Tipp ist denke ich eindeutig, ich kann nun damit was anfangen, bin mit meinen Analysen weiter =D


BenBE - Do 17.12.09 18:27

Also der Tipp ist mal wieder typisch für unser Mod-Team: Verwirrend ;-) Da muss man aber wirklich schon seitwärts denken, um von der Lösung auf den Tipp zu kommen!


Christian S. - Sa 19.12.09 13:34

Hallo!

Ich habe oben einen weiteren Tipp eingefügt :-)

Grüße
Christian


Niko S. - Sa 19.12.09 13:39

Der Weihnachtsmann sollte sich wirklich bessere Hardware zulegen ....


Sylvus - Sa 19.12.09 14:11

Wenn ich "Farben nach Pixel" lese, hört mein Kopf automatisch auf zu denken, weil er sonst in eine Endlosschleife rutschen würde, was sich negativ auf meine Gesundheit auswirken könnte...


Noob23 - So 20.12.09 07:39

Hab zwar eine plausible Lösung, nur die Tipps hätten mir keinen Deut weitergeholfen - eher das Gegenteil, die Verzweiflung hätte mich heimgesucht :roll:


OG Karotte - So 20.12.09 16:12

Ich hab' weder 'ne plausible Lösung, noch kann ich mit den Tipps irgendetwas anfangen :autsch:

Ich hab' nich mal 'ne Ahnung wo ich "ansetzen" soll :oops:


Niko S. - So 20.12.09 19:53

Versuch doch mal nen Hex Editor... Hier gibts einen im Forum (HxD)


OG Karotte - So 20.12.09 20:30

user profile iconNiko S. hat folgendes geschrieben Zum zitierten Posting springen:
Versuch doch mal nen Hex Editor... Hier gibts einen im Forum (HxD)

Das war das erste was ich genutzt hab'. Ich habe bislang nur keinen Ansatz gefunden die Daten richtig zu interpretieren :oops:

Na ja, ein paar Stunden hab' ich ja noch...
... und wenn alles nichts hilft nutz' ich die 25% Chance :wink:


Heiko - So 20.12.09 20:33

Mal eine Frage ans Team: Wie sieht bei euch nen Wichtel aus? Ein Wichtel ist ja ein Fantasiegeschöpf. Von daher kann er ja auch wie ein Hase, Tiger, Rentier, Schneemann oder sonstwas aussehen...


Christian S. - So 20.12.09 20:42

Ein Wichtel sieht logischerweise nicht so aus wie die anderen Optionen.


Christian S. - Mo 21.12.09 01:20

Soooo, die Auflösung für dieses Rätsel ist, dass ein Hase zu sehen ist.

Um eine Filmdatei in Frames zu zerlegen, muss man erst einmal wissen, wie groß so ein Frame ist. Das steht in der Filmdatei ganz am Anfang, nämlich das Byte mit Wert 100, dann die Buchstaben "EE", wieder ein Byte 100 und dann wieder die Buchstaben "EE". Ein Frame hat die Dimension 100 x 100 Pixel.

Normalerweise würde man bei einem Film hergehen, und speichert erst die Pixel des Frames Nr. 1, dann Frame Nr. 2, etc. Innerhalb eines Frames speichert man für jedes Pixel die Farben in diesem Pixel zusammen. Da unser Videoformat "3-Eyes-Ready" ist, braucht man drei Farben pro Pixel.

Tatsächlich hat der Sturz des Weihnachtsmannes aber dazu geführt, dass die Farben Haufen bildeten. Die oben beschriebene Gruppierung von Pixel nach Frame und Farbe nach Pixel galt nicht mehr. Die Anordnung der Daten war vielmehr so, dass zuerst für Pixel (1,1) alle Rotwerte aller Frames hintereinander geschrieben wurden, dann alle Grünwerte und dann alle Blauwerte (hier Null, weil die Kamera nur für Zweiäuger aufnahm). Dann wurde zum nächsten Pixel gegangen und wieder erst alle Rotwerte aller Frames gespeichert, etc.

Ein Lösungsprogramm (zip, 6.33 KB) könnte dann folgendes machen, wenn man die verschiedenen Frames in einer PictureBox anzeigen möchte (per Trackbar selektiertbar):

Delphi-Prism-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
  var ofd := new OpenFileDialog();
  if ofd.ShowDialog = DialogResult.OK then
  begin
    //Filmdaten lesen
    var bytes := File.ReadAllBytes(ofd.FileName);

    //Dimensionen eines Frames bestimmen
    var width := Int32(bytes[0]);
    var height := Int32(bytes[3]);

    //Anzahl der Frames
    var frameCount := (bytes.Length - 6) / (width * height * 3);
    fFrames := new Bitmap[frameCount];

    //Initialisierung
    for i : Integer := 0 to frameCount - 1 do
      fFrames[i] := new Bitmap(width, height);

    //Alle Pixel durchgehen
    for x : Integer := 0 to width-1 do
      for y : Integer := 0 to height-1 do
      begin       
        var idx := 6 + (width * x + y)*(3*frameCount); //Ein Pixel ist (3 Bytes)*(Frame-Anzahl) groß
        for i : Integer := 0 to frameCount - 1 do //Für jeden Frame die Farben des Pixels bestimmen
          fFrames[i].SetPixel(x, y, Color.FromArgb(bytes[idx+i], bytes[idx+i+frameCount], bytes[idx+i+2*frameCount]));
      end;

    //Anzeige-Gedöns
    trackBar1.Maximum := frameCount-1;
    pictureBox1.Image := fFrames[0];
  end;


Bis auf Invertierung erhält man dann pro Frame dieses Bild zweimal (jeweils in verschiedenen Farbkanälen):
hase


BenBE - Mo 21.12.09 01:26

Oder man nehme Low-Tech, starte den Hex-Editor seiner Wahl, stelle 42h (66 Bytes) pro Zeile ein und drücke PageDown. Schon läuft der Hase von Links nach Rechts ;-)


Christian S. - Mo 21.12.09 01:27

Cheater :mrgreen:


BenBE - Mo 21.12.09 01:31

user profile iconChristian S. hat folgendes geschrieben Zum zitierten Posting springen:
Cheater :mrgreen:

Wenn ihr die Backdoor offen lasst :P Wär man doch schön blöd, da nicht durchzugehen :mrgreen:


Flamefire - Mo 21.12.09 19:36

Hm...100x100?
Die habe ich nicht gefunden...
Ich hätte ein 66*100 zu bieten
oder 3x 22*100:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
procedure TForm1.Button2Click(Sender: TObject);
var x,y,cur:Integer;
begin
  cur:=Button2.Tag;
  if(cur=Length(a)) then begin
    Timer1.Enabled:=false;
    exit;
  end;
  for y := 0 to 100 - 1 do begin
    for x := 0 to 22 - 1 do begin
      if(a[cur]=0then Image1.Canvas.Pixels[x,y]:=clBlack
      else Image1.Canvas.Pixels[x,y]:=clWhite;
      Inc(cur,1);
    end;
    for x := 0 to 22 - 1 do begin
      if(a[cur]=0then Image2.Canvas.Pixels[x,y]:=clBlack
      else Image2.Canvas.Pixels[x,y]:=clWhite;
      Inc(cur,1);
    end;
    for x := 0 to 22 - 1 do begin
      if(a[cur]=0then Image3.Canvas.Pixels[x,y]:=clBlack
      else Image3.Canvas.Pixels[x,y]:=clWhite;
      Inc(cur,1);
    end;
  end;
  Button2.Tag:=cur;
end;


Das sieht irgendwie schön einfach und übersichtlich aus. Und da läuft auch der Hase.
Ist mal wieder typisch: Ich hab die Lösung, aber versteh die Tipps und die Musterlösung nicht ^^