我目前已经实现了JFIF格式的jpg图片的DPI的读取和设置,代码如下:
procedure GetResJpg(JPGFile: string;var HorzRes, VertRes: Word);
const
  BufferSize = 50;
var
  Buffer: string;
  Index: integer;
  FileStream: TFileStream;  DP: Byte;
  Measure: string;
begin
  FileStream := TFileStream.Create(JPGFile,fmOpenReadWrite);
  try
    SetLength(Buffer, BufferSize);
    FileStream.Read(buffer[1], BufferSize);
    Index := Pos('JFIF' + #$00, buffer);
    if Index > 0 then
    begin
      FileStream.Seek(Index + 6, soFromBeginning);
      FileStream.Read(DP, 1);
      case DP of
         1: Measure := 'DPI'; //Dots Per Inch
         2: Measure := 'DPC'; //Dots Per Cm.
      end;
      FileStream.Read(HorzRes, 2); // x axis
      HorzRes := Swap(HorzRes);
      FileStream.Read(VertRes, 2); // y axis
      VertRes := Swap(VertRes);
    end
  finally
    FileStream.Free;
  end;
end;procedure TForm1.SetJpgdpi(filename: string; dpix, dpiy: Integer);
const
   BufferSize = 50;
   DPI = 1; {inch}
   DPC = 2; {cm}
var
   Buffer: string;
   index: Integer;
   FileStream: TFileStream;
   xResolution: WORD;
   yResolution: WORD;
   typeA: Byte;
begin
   FileStream := TFileStream.Create(filename, fmOpenReadWrite);
   try
      SetLength(Buffer, BufferSize);
      FileStream.Read(buffer[1], BufferSize);
      index := Pos('JFIF' + #$00, buffer);
      if index > 0 then
         begin
            FileStream.Seek(index + 6, soFromBeginning);
            typeA := DPI;
            FileStream.write(typeA, 1);
            xresolution := swap(dpix);
            FileStream.write(xresolution, 2);
            yresolution := swap(dpiy);
            FileStream.write(yresolution, 2);
         end
   finally
      FileStream.Free;
   end;
end;
但是我发现有的有一些jpg图片不能读取也不能设置,仔细研究发现,头文件的信息里没有'JFIF',我理解为不是JFIF格式,请问有什么办法能够读取和设置各种格式JPG图片的DPI?

解决方案 »

  1.   

    是的,不是JFIF格式。没有通用的处理方案
      

  2.   

    那windows系统是怎么读取出来非JFIF格式图片的DPI的呢?
    有没有系统API直接读取的?
      

  3.   

    GDI+  获取:
    TGpImage.GetHorizontalResolution  
    TGpImage.GetVerticalResolution  设置:
    TGpImage.SetHorizontalResolution  
    TGpImage.SetVerticalResolution  
      

  4.   

    通过GDI+修改DPI属性是否会对文件本身产生影响?我只是想修改文件的属性,不想改动图像本身。我曾经想过安装GDI来做这个工作,后来看了看代码,好像GDI进行修改文件属性的时候,图像也会根据文件属性产生变化。
      

  5.   

    现在我针对JFIF和EXIF两种格式,分别来处理了。就是找EXIF文件的格式很费了一些功夫。
      

  6.   

    网上有EXIF的文档可以查看的,还有个老外写的EXIF类,可以直接使用
    http://code.google.com/p/ccr-exif