Ver Mensaje Individual
  #4  
Antiguo 06-04-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Reputación: 24
seoane Va por buen camino
Primero dices:
Cita:
debo salvar mi grafico en .jpg o .bmp.
Y luego dices:
Cita:
Lo que estoy realmente salvando es un .jpg.
Muchas veces pienso que si la gente explicara lo que realmente quiere ahorraríamos mucho tiempo

De todas formas podemos hacer para el jpg lo mismo que hicimos para el bmp, es decir, modificar la parte del fichero donde se guardan esos valores. en el caso del jpeg esta información se guarda en el segmento AP0, así que añadimos un nuevo segmento AP0 con la información que queremos y borramos la información anterior.

El código nos quedaría mas o menos así:
Código Delphi [-]
uses jpeg;

procedure AjustarDPI(Origen, Destino: TStream; Rx,Ry: Word);
var
  AP0: array[1..18] of byte;
  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);
  FillChar(AP0,Sizeof(AP0),#0);
  AP0[1]:= $FF;
  AP0[2]:= $E0;
  AP0[4]:= Sizeof(AP0) - 2;
  AP0[5]:= Byte('J');AP0[6]:= Byte('F');AP0[7]:= Byte('I');AP0[8]:= Byte('F');
  AP0[10]:= 1; AP0[11]:= 2;
  AP0[12]:= 1;
  AP0[13]:= Rx shr 8; AP0[14]:= Rx and $FF;
  AP0[15]:= Ry shr 8; AP0[16]:= Ry and $FF;
  Destino.WriteBuffer(AP0,Sizeof(AP0));
  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;

procedure SaveToFileDPI(Imagen: TJpegImage; Filename: String; Rx, Ry: Word);
var
  Temp: TMemoryStream;
  Stream: TFileStream;
begin
  Temp:= TMemoryStream.Create;
  try
    Imagen.SaveToStream(Temp);
    Stream:= TFileStream.Create(Filename, fmCreate);
    try
      AjustarDPI(Temp,Stream,Rx,Ry);
    finally
      Stream.Free;
    end;
  finally
    Temp.Free;
  end;
end;

Para usarlo solo tienes que sustituir esta linea:
Código Delphi [-]
MyJPEG.SaveToFile(FileName);

Por esta otra:
Código Delphi [-]
SaveToFileDPI(MyJPEG,FileName,300,300);
Responder Con Cita