数据库中存有图像二值化后的16进制字符串,如何还原显示为图像,请各位帮忙啊!!!
例一:
3070FF0780C1013CE01FEC3FF0033070FF0780C1013CE01FEC3FF00
308600E0F80E3001E70382C1FFC0F08610E1E00E3000770F03C001C
0E08610E1E00E3000770F03C001C0ED8630E1E007B000778E038001
C0CC8670C0F0076800158E038001C0CC8670C0F0076800158E03800
1C0C4969FC070034C00178E0B8031C0EC96F例二:
0000f8ff017e0004e0ffff3f00000000f8ff017e0004e0ffff3f000
00102f87f00ff031ee0fffd1f80074140387c0087031e00f8780080
32500187c0081031e00383800e0012500187c0081031e00383800e0
010706183c8081071e0038380070000707381e8081071e001cf8017
0000746f80f00ff071c001cf81f7c000746

解决方案 »

  1.   

    我只对Delphi比较熟,各位专家多指点啊,delphi如何实现啊?
      

  2.   

    不是编码压缩的,一般SQL SERVER保存图片会是这种格式,你自己在网上查询一下图片存储的格式,比如FFD8表示JPG图片,424D表示BMP图片,根据标记位先判断好图片类型后,取其后的代码就是图片的存储内容
    给你一段参考代码(根据类型读入流后,写到一个IMAGE里面):
    function TDM.JpegStartsInBlob(PicField:TBlobField):integer;
    var
      bs:TADOBlobStream;
      buffer:Word;
      hx:string;
    begin
      Result:=-1;
      bs:=TADOBlobStream.Create(PicField,bmRead);
      try
        while (Result=-1)and(bS.Position+1<bS.Size) do
        begin
          bS.ReadBuffer(buffer,1);
          hx:=IntToHex(buffer,2);
          if hx='FF'then
          begin
            bS.ReadBuffer(buffer,1);
            hx:=IntToHex(buffer,2);
            if hx='D8'then Result:=bS.Position-2
            else if hx='FF' then bS.Position:=bS.Position-1;
          end;
        end;
      finally
        bS.Free;
      end;
    end;function TDM.BMPStartsInBlob(PicField:TBlobField):integer;
    var
      bs:TADOBlobStream;
      buffer:Word;
      hx:string;
    begin
      Result:=-1;
      bs:=TADOBlobStream.Create(PicField,bmRead);
      try
        while (Result=-1)and(bS.Position+1<bS.Size) do
        begin
          bS.ReadBuffer(buffer,1);
          hx:=IntToHex(buffer,2);
          if hx='42'then
          begin
            bS.ReadBuffer(buffer,1);
            hx:=IntToHex(buffer,2);
            if hx='4D'then Result:=bS.Position-2
            else if hx='FF' then bS.Position:=bS.Position-1;
          end;
        end;
      finally
        bS.Free;
      end;
    end;procedure TDM.ShowImage(PicField:TBlobField;SImage:TImage);
    var
      bS:TADOBlobStream;
      Pic:TJpegImage;
      BImage:TBitMap;
    begin
      bS:=TADOBlobStream.Create(PicField,bmRead);
      try
        if JpegStartsInBlob(PicField)<>-1 then
        begin
          bS.Seek(JpegStartsInBlob(PicField),soFromBeginning);
          Pic:=TJpegImage.Create;
          try
            Pic.LoadFromStream(bS);
            SImage.Picture.Graphic:=Pic;
          finally
            Pic.Free;
          end;
        end
        else if BMPStartsInBlob(PicField)<>-1 then
        begin
          bS.Seek(BMPStartsInBlob(PicField),soFromBeginning);
          BImage:=TBitMap.Create;
          try
            BImage.LoadFromStream(bS);
            SImage.Picture.Bitmap:=BImage;
          finally
            BImage.Free;
          end;
        end
        else
        begin
          SImage.Picture:=Nil;
        end;
      finally
        bS.Free;
      end;
    end;
      

  3.   

    ff07和F8FF表示什么类型不记得了,你可以在网上查一下。
      

  4.   

    0x6C74000072480000FFD8FFE000104A46494600010201012C012C0000
    FFED0C7850686F746F73686F7020332E30003842494D03ED0000000000
    10012C000000010002012C0000000100023842494D040D000000000004
    000000783842494D03F300000000000800000000000000003842494D04
    0A0000000000010000384249这是一副JPG格式的肖像照片保存在SQL SERVER中的数据,应该与你的类似
      

  5.   

    非常感谢各位的回复,经过多次咨询,数据未写入任何格式,只简单地存储了点的黑白信息,图像宽度112,解决如下
    unit uFrmMain;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls;type
      TFrmMain = class(TForm)
        mmoHex: TMemo;
        pbPlate: TPaintBox;
        btn1: TButton;
        btnExit: TButton;
        lbl1: TLabel;
        mmoNext: TMemo;
        procedure pbPlatePaint(Sender: TObject);
        procedure btn1Click(Sender: TObject);
        procedure btnExitClick(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        FValidBuffer: Boolean;
        FBuff: array[0..2239] of Byte;    procedure prShowPlate;
        function fnTruncate(AValue: string): string;
        function fnHexToByte(AData: Char): Byte;
      public
        { Public declarations }
      end;var
      FrmMain: TFrmMain;implementation{$R *.dfm}procedure TFrmMain.pbPlatePaint(Sender: TObject);
    begin
      with pbPlate.Canvas do
      begin
        Brush.Color := clBlack;
        FillRect(ClientRect);    if FValidBuffer then
          prShowPlate;
      end;
    end;procedure TFrmMain.btn1Click(Sender: TObject);
    var
      I: Integer;
      J: Integer;
      FLoValue: Byte;
      FHiValue: Byte;
      FText: string;
      FLen: Integer;
    begin
      FillChar(FBuff, SizeOf(FBuff), 0);  FText := fnTruncate(UpperCase(mmoHex.Text));
      FLen := Length(FText) div 2;
      J := 0;
      for I := 0 to FLen - 1  do
      begin
        FHiValue := fnHexToByte(FText[I * 2 + 1]);
        FLoValue := fnHexToByte(FText[I * 2 + 2]);
        FBuff[J] := FLoValue and 1;
        FBuff[J + 1] := (FLoValue shr 1) and 1;
        FBuff[J + 2] := (FLoValue shr 2) and 1;
        FBuff[J + 3] := (FLoValue shr 3) and 1;
        FBuff[J + 4] := FHiValue and 1;
        FBuff[J + 5] := (FHiValue shr 1) and 1;
        FBuff[J + 6] := (FHiValue shr 2) and 1;
        FBuff[J + 7] := (FHiValue shr 3) and 1;    Inc(J, 8);
      end;  FValidBuffer := True;
      pbPlate.Invalidate;
    end;procedure TFrmMain.btnExitClick(Sender: TObject);
    begin
      Close;
    end;function TFrmMain.fnHexToByte(AData: Char): Byte;
    begin
      case AData of
        '1'..'9': Result := Ord(AData) - Ord('0');
        'A'..'F': Result := Ord(AData) - Ord('A') + 10;
      else
        Result := 0;
      end;
    end;function TFrmMain.fnTruncate(AValue: string): string;
    var
      I: Integer;
    begin
      Result := '';
      
      for I := 1 to Length(AValue) do
      begin
        if AValue[I] In [#10, #13] then Continue;    Result := Result + AValue[I];
      end;
    end;procedure TFrmMain.FormCreate(Sender: TObject);
    begin
      mmoHex.Text := UpperCase(mmoHex.Text);
      FValidBuffer := False;
    end;procedure TFrmMain.prShowPlate;
    var
      I: Integer;
      FRow: Integer;
      FCol: Integer;
    begin
      with pbPlate.Canvas do
      begin
        for I := 0 to 2239 do
        begin
          FRow := I mod 112;
          FCol := I div 112;      if FBuff[I] = 1 then
            Pixels[FRow, FCol] := clWhite
          else
            Pixels[FRow, FCol] := clBlack;
        end;
      end;
    end;end.