我有一些不规则的图片 为了在显示和打印时保持长宽比例不变形 怎样在delphi读出一个图片(jpg格式)的长度和宽度啊?

解决方案 »

  1.   

    Image1: TImage;
    ...
        Image1.Picture.LoadFromFile(Filename);
        if Image1.Picture.Graphic is TJPEGImage then 
          with TJPEGImage(Image1.Picture.Graphic) do begin
            h:=Height;
            w:=Width;
          end;
      

  2.   

    easy:
    uses jpeg;
    ..........
    Image1.AutoSize:=True;
    Image1.Picture.LoadFromFile(jpegfilename);
    Image1.Width;//width of jpeg picture.
    Image1.Height;//height of jpeg picture.
      

  3.   

    通用做法
    var Picture:TPicture;Picture.LoadFromFile(Filename);
    Picture.Graphic.Height
    Picture.Graphic.Width确定是JPEG时
    var JPEG:TJPEGImage;JPEG.LoadFromFile(Filename);
    JPEG.Height
    JPEG.Width写过,看过图像解码程序吗?你以为这些信息是哪来的?还不是从文件中读取出来的!不建议使用 blazingfire的方法,控件的大小是可以改变!虽然在AutoSize=True时,他们相等,但毕竟不是图像长宽!不要舍近求远了,要讲究开发效率!但如果是作为技术研究,你应该自己去把长宽变为16进制到文件中去比对!
      

  4.   

    To:Hillside(要命的是买不到D盘了) 
       你的那种做法肯定不行。我要的不是IMAGE的长宽 而是想要jpg原始文件的长宽TO:blazingfire(烈焰) ( ) 
       你的做法是让IMAGE适应原始jpg文件的大小 再通过image的长宽来读jpg图片的长宽, 虽然可以得出正确的结果,但做法有些搞笑 不可取
       因为如果jpg比较大的话,刷屏厉害 而且用户不需要看到中间的那个过程 再说速度也会慢
    顺便帮忙一下: 插图片到EXCEL中的VBA怎么写啊
      

  5.   

    ehom(?!) 的写法运行的时候死机。也得不出结果
      

  6.   

    Picture:=TPicture.Create;
    JPEG:=TJPEGImage.Create;你是不是没加上面的语句?看来你太粗心了!
      

  7.   

    获取JPEG的宽度、高度等信息
    { Copyright Kingron 2002 }
    function GetJPEGSize(FileName: string; var Width, Height: WORD): Boolean;
    const
      JPEG_FLAG_BEGIN = $D8FF;
      JPEG_FLAG_END = $D9FF;
      JPEG_FRAME = $C0FF;
    var
      FS: TFileStream;
      Flag1, Flag2: WORD;
      B: Byte;  procedure SeekForFrame;
      type
        TSegHeader = packed record
          Flag: WORD;
          LenHi, LenLo: Byte;
        end;
      var
        Seg: TSegHeader;
      begin
        with Seg, FS do
          repeat
            Read(Seg, SizeOf(Seg));
            if Flag <> JPEG_FRAME then
              Position := Position + MakeWord(LenLo, LenHi) - 2;
          until (Position >= Fs.Size) or (Seg.Flag = JPEG_FRAME);
      end;begin
      FS := TFileStream.Create(FileName, fmOpenRead);
      try
        { JPEG 文件开头必须为 FF D8,文件尾必须为 FF D9 }
        FS.Read(Flag1, SizeOf(Flag1));
        FS.Position := FS.Size - 2;
        FS.Read(Flag2, SizeOf(Flag2));
        Result := (Flag1 = JPEG_FLAG_BEGIN) and (Flag2 = JPEG_FLAG_END);
        if not Result then exit; { 不是合法的JPEG文件则退出 }    FS.Position := 2;
        SeekForFrame; { 寻找JPEG的Frame段,即图像数据区 }
        FS.Read(B, SizeOf(B)); { Frame段段头后第一个Byte为数据精度 }    FS.Read(B, SizeOf(B)); { 高度高字节 }
        WordRec(Height).Hi := B;
        FS.Read(B, SizeOf(B)); { 高度低字节 }
        WordRec(Height).Lo := B;    FS.Read(B, SizeOf(B)); { 宽度高字节 }
        WordRec(Width).Hi := B;
        FS.Read(B, SizeOf(B)); { 宽度低字节 }
        WordRec(Width).Lo := B;
      finally
        FS.Free;
      end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      W, H: Word;
    begin
      with OpenDialog1 do
        if Execute then
          if GetJPEGSize(FileName, W, H) then
            Caption := Format('Yes,W:%d,H:%d', [W, H])
          else Caption := 'No';
    end;