Make your own free website on Tripod.com

Olympus E-10
ORF format

 

 

 

 

 

[Home]

 

Ez a leírás elsősorban a raw fájl nyers képadataihoz való hozzáférést tartalmazza, a fejléccel annak érvénységével a fejlécben található adatokkal (gépbeállítások, previewkép) nem foglalkoztam. Ha esetleg ebben a témában van infoja azt szívesen veszem.

Ez a fájl az Olympus állítása szerint a nyers CCD-ről érkező jeleket tartalmazza változtatások/korrekciók nélkül.
A raw (.orf) fájl két jól elkülöníthető részre osztható: a fejléc, és a nyers képadatok.

-Fejléc:
A fejléc hitelessége megállapítható az első 4 byte-ból (MMOR, $4D $4D $4F $52) (magic num).

-Képadatok:
A képadatok a fájlban a $4000-es címtől kezdve a fájl végéig találhatók.
A képadatok egy 2256x1684-es pixel mátrixban vannak. A képadatokat pixel folytonosan balról jobbra és fentről lefelé kell értelmezni. Az egyes képpontok 10 bit-nyi információt tartalmaznak. A képpontok mindegyike egy adott szín fényességét hordozza. A színek a következőképpen helyezkednek el:

A bal fölső sarokban mindig vörös képpont van.

Egy képpont 2 byte-on van ábrázolva. A fájlban az elöl álló byte tartalmazza a felső 8 bitet, a második byte felső 2. bitje pedig a képpont alsó 2 bitjét. Pl: fájlban a $4000-es címen a $47 és a $4001-es cimen $80 helyezkedik el. Ennek értelmezése a következő:
$47 = 01000111
$80 = 10000000
Az eredmény: 01000111 + 10 = 0100011110 = $11E = 286.

A következő delphi5 kódrészlet megjeleníti a képet a 10 bitet egyszerű lienáris konverzióval 8 bitté alakítja. A kód nem tartalmaz ellenőrzést ezért csak valódi E10-ből származó .orf fájlon működik.

procedure TForm1.Button1Click(Sender: TObject);
{*******************************************************}
{ Olympus E10 raw file viewer }
{ Copyright (c) 2001Galló László }
{ All rights reserved }
{ mailto:lgallo@freemail.hu }
{ http://www.extra.hu/e10 }
{*******************************************************}
var i,j,k:LongInt;
    TempStream : TMemoryStream;
    colors:array [0..1] of word;
    r,g,b, w:integer;
    lookuptable:array [0..1023] of byte;

function rotate(w:word):byte;
var l,h,b:byte;
begin
  l:=Lo(w);
  h:=Hi(w);
  w:=l shl 2;
  h:=h shr 6;
  w:=w + h;
  If w > 1023 then begin
     w:=1023;
     end;
  b:=lookuptable[w];
  rotate:=b;
end;

begin
  for i:=0 to 255 do begin
      lookuptable[i*4+0]:=i;
      lookuptable[i*4+1]:=i;
      lookuptable[i*4+2]:=i;
      lookuptable[i*4+3]:=i;
      end;

  w:=752*3;
  image1.Picture.Bitmap.PixelFormat:=pf24bit;
  image1.Picture.Bitmap.Height:=1684;
  image1.Picture.Bitmap.Width:=w;

  TempStream := TMemoryStream.Create;
  TempStream.LoadFromFile('Pxxxxxxx.ORF');
  TempStream.Seek($4000,soFromBeginning);
  j:=0;
  k:=0;

  r:=1;
  g:=256;
  b:=256*256;

  For i:=$4000 to $4000+Trunc(((TempStream.Size-$4000)/SizeOf(colors)))-1 do begin
       TempStream.Read(colors,sizeof(colors));
       If k mod 2 <> 0 then begin
          image1.Canvas.Pixels[j,k]:=rotate(colors[0])*g; //g
          Inc(j);
          image1.Canvas.Pixels[j,k]:=rotate(colors[1])*b; //b
          Inc(j);
          end else begin
          image1.Canvas.Pixels[j,k]:=rotate(colors[0])*r; //r
          Inc(j);
          image1.Canvas.Pixels[j,k]:=rotate(colors[1])*g; //g
          Inc(j);
          end;
       If j >= w then begin
          j:=0;
          inc(k);
          form1.Caption:=IntToStr(k);
          end;
       end;
  image1.Picture.SaveToFile('rgb.bmp');
  TempStream.Free;
end;

A program letölthető (futtatható) verziója: [raw2bmp.zip]

Az eredmény képen látható hogy a színek megfelelő kiegyenlítést igényelnek (TruePic eljárás):
Az eredeti kép egy részlete:



A program által konvertált részlet:



RGB konverzió (Photoshop Plug-In):



RGB, Auto image process (TruePic) (Photoshop Plug-In):




2001.01.04. v1.0.0
2001.01.05. v1.1.0
2001.01.22. v1.2.0
2001.01.25. v1.2.1

Copyright (c) Gallo Laszlo