Lo de no comentar el codigo es una fea costumbre que tengo, pero estoy encantado de comentarlo si esta interesado. Para no volver a subir el proyecto voy a ir poniendo aqui varias de las funciones ya comentadas:
Estas funciones manejan el archivo JPEG una vez lo tenemos en un stream
Código Delphi
[-]
function LeerCom(Stream: TStream): string;
var
Buffer: array[0..$FFFF] of Char;
Header: array[1..4] of byte;
Size: Integer;
begin
Stream.Seek(0,soFromBeginning);
Stream.ReadBuffer(Header,2);
if (Header[1] <> $FF) or (Header[2] <> $D8) then
raise Exception.Create('Identificador incorrecto');
repeat
Stream.ReadBuffer(Header,4);
Size:= ((Header[3] shl 8) + Header[4]) - 2;
case Header[2] of
$FE: begin
FillChar(Buffer,Sizeof(Buffer),0);
Stream.ReadBuffer(Buffer,Size);
Result:= String(PChar(@Buffer));
end;
$01,$D0..$D9: Stream.Seek(-2,soFromCurrent) ;
else Stream.Seek(Size,soFromCurrent);
end;
until (Result <> '') or (Header[2] = $DA);
end;
procedure InsertarCom(Origen, Destino: TStream; Comment: string);
var
Buffer: array[0..$FFFF] of Char;
Header: array[1..4] of byte;
Size: Integer;
begin
Origen.Seek(0,soFromBeginning);
Origen.ReadBuffer(Header,2);
if (Header[1] <> $FF) or (Header[2] <> $D8) then
raise Exception.Create('Identificador incorrecto');
Destino.WriteBuffer(Header,2);
Size:= Length(Comment) + 2;
Header[1]:= $FF;
Header[2]:= $FE;
Header[3]:= Size div 256;
Header[4]:= Size mod 256;
StrCopy(@Buffer,PChar(Comment));
Destino.WriteBuffer(Header,4);
Destino.WriteBuffer(Buffer,Length(Comment));
Destino.CopyFrom(Origen,Origen.Size - Origen.Position);
end;
procedure Limpiar(Origen, Destino: TStream);
var
Buffer: array[0..$FFFF] of Char;
Header: array[1..4] of byte;
Size: Integer;
begin
Origen.Seek(0,soFromBeginning);
Origen.ReadBuffer(Header,2);
if (Header[1] <> $FF) or (Header[2] <> $D8) then
raise Exception.Create('Identificador incorrecto');
Destino.WriteBuffer(Header,2);
repeat
Origen.ReadBuffer(Header,4);
Size:= ((Header[3] shl 8) + Header[4]) - 2;
case Header[2] of
$FE, $E0..$EF: Origen.Seek(Size,soFromCurrent);
$01,$D0..$D9: begin
Destino.WriteBuffer(Header,2);
Origen.Seek(-2,soFromCurrent)
end
else
begin
Origen.ReadBuffer(Buffer,Size);
Destino.WriteBuffer(Header,4);
Destino.WriteBuffer(Buffer,Size);
end;
end;
until Header[2] = $DA;
Destino.CopyFrom(Origen,Origen.Size - Origen.Position);
end;
Para mas informacion sobre el formato de archivo JPEG
http://www.wotsit.org/search.asp?page=5&s=graphics
PD: Al comentar la funcion de insertar comentario me di cuenta de que daba mas pasos de los necesarios, debido a una confusion que tenia con respecto al primer segmento.
Esto demuestra que nunca esta mal repasar el codigo