存取JPEG文件
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, DBCtrls, Grids, DBGrids, Db, ADODB,jpeg, StdCtrls,dbtables;
 {一定要USES JPEG单元,使能存储JPG文件格式}
type
TForm1 = class(TForm)
  DataSource1: TDataSource;
  ADOQuery1: TADOQuery;
  DBGrid1: TDBGrid;
  DBNavigator1: TDBNavigator;
  Image1: TImage;
  savebutton: TButton;
  showbutton: TButton;
  OpenDialog1: TOpenDialog;
  ADOQuery1id: TIntegerField;
  ADOQuery1pic: TBlobField;
  procedure savebuttonClick(Sender: TObject);
  procedure showbuttonClick(Sender: TObject);
  procedure DBNavigator1Click(Sender: TObject; Button: TNavigateBtn);
private
  { Private declarations }
public
  { Public declarations }
end;var
Form1: TForm1;implementation{$R *.DFM}function JpegStartsInBlob(PicField:TBlobField):integer;
 var
  ghy: TADOBlobstream;
  buffer:Word;
  hx: string;
 begin
  Result := -1;
  ghy := TADOBlobstream.Create(PicField, bmRead);
  try
  while (Result = -1) and (ghy.Position + 1 < ghy.Size) do
  begin
   ghy.ReadBuffer(buffer, 1);
   hx:=IntToHex(buffer, 2);
   if hx = ’FF’ then begin
   ghy.ReadBuffer(buffer, 1);
   hx:=IntToHex(buffer, 2);
   if hx = ’D8’ then Result := ghy.Position - 2
   else if hx = ’FF’ then
      ghy.Position := ghy.Position-1;
   end; //if
  end; //while
  finally
   ghy.Free
  end; //try
 end;
procedure TForm1.savebuttonClick(Sender: TObject);
var
picstream:tadoblobstream;
begin
adoquery1.edit;
picstream:=tadoblobstream.Create(tblobfield(adoquery1.fields[1]),bmWrite);
if form1.opendialog1.execute then
begin
picstream.LoadFromFile(opendialog1.filename);
picstream.Position:=0;
adoquery1.edit;
tblobfield(adoquery1.Fields[1]).loadfromstream(picstream);
adoquery1.post;
end;
end;procedure TForm1.showbuttonClick(Sender: TObject);
var
ghy:TADOBlobstream;
pic:tjpegimage;
begin
ghy := TADOBlobstream.Create(Adoquery1pic, bmRead);
try
ghy.Seek(JpegStartsInBlob(Adoquery1pic),soFromBeginning);
Pic:=TJpegImage.Create;
try
 Pic.LoadFromStream(ghy);
 Image1.Picture.Graphic:=Pic;
finally
 Pic.Free;
end;
finally
ghy.Free
end;
end;procedure TForm1.DBNavigator1Click(Sender: TObject; Button: TNavigateBtn);
begin
if button in [nbFirst, nbPrior, nbNext, nbLast] then showbutton.Click;
end;end.如果数据库中要存储的是BMP文件,则在procedure TForm1.showbuttonClick(Sender: TObject);过程中代码更改如下即可存储显示BMP文件格式的操作。
procedure TForm1.showbuttonClick(Sender: TObject);
var
ghy:TADOBlobstream;
pic:tbitmap;
begin
ghy := TADOBlobstream.Create(Adoquery1pic, bmRead);
try
{ ghy.Seek(JpegStartsInBlob(Adoquery1pic),soFromBeginning);}
Pic:=Tbitmap.Create;
try
 Pic.LoadFromStream(ghy);
 Image1.Picture.Graphic:=Pic;
finally
 Pic.Free;
end;
finally
ghy.Free
end;
end; 

解决方案 »

  1.   

    楼主应该先看一下这个,(100分啊,好可惜^^_^^):
    http://community.csdn.net/Expert/topic/3277/3277402.xml?temp=.1504633
      

  2.   

    http://www.yesky.com/SoftChannel/72342371928440832/20030929/1733136_1.shtml对你有帮助
      

  3.   

    我是存储的声音,和图片一样,给你个例子
    //新增告警声音(相当于存储图片)
    procedure TFrm_Alarm.B_SOKClick(Sender: TObject);
    var
      ADOQ_SoundA:TADOQuery;
      s:TStream;
    begin
      try
        s:=TFileStream.Create(cxButtonEdit1.Text,fmopenread);
      except
        s.Free;
        Application.MessageBox('声音文件不正确,请检查路径是否正确','成都超讯提醒您',mb_ok+MB_ICONWARNING);
        exit;
      end;  ADOQ_SoundA:=TADOQuery.Create(nil);
      ADOQ_SoundA.Connection:=DM_DATABASELINK.ADO_CDLINK;
      try
        Screen.Cursor:=crHourGlass;
        with ADOQ_SoundA do
        begin
          close;
          sql.Clear;
          sql.Add('insert into FM_ALAMR_SOUND (SOUND_FILE,SOUND_MEMO) VALUES (:sfi,:sme) ');      parameters.ParamByName('sfi').LoadFromStream(s,ftblob);       //强制转化为二进制流文件(路径)
          Parameters.ParamByName('sme').Value:=Trim(cxTextEdit1.Text);      try
            ExecSQL;
            WriteOperateLog(UserMessage.UserID,UserMessage.UserName,'增加','增加声音文件 '+cxTextEdit1.Text);
          except
            Application.MessageBox('新增出错,请检查新增内容是否正确!','成都超讯提醒您',MB_OK+MB_ICONWARNING);
            WriteOperateLog(UserMessage.UserID,UserMessage.UserName,'错误','增加声音文件 '+cxTextEdit1.Text+ '出错误');
            exit;
          end;
        end;
        CreateAlarmSound;                                  //创建告警声音    cxButtonEdit1.Text:='';
        cxTextEdit1.Text:='';
      finally
        s.Free;
        ADOQ_SoundA.Free;
        Screen.Cursor:=crDefault;
      end;
    end;//试听告警声音(相当于读取图片)
    procedure TFrm_Alarm.cxLV_SoundDblClick(Sender: TObject);
    var
      ADOQSound:TADOQuery;
    begin
      if cxLV_Sound.Selected=nil then exit;  ADOQSound:=TADOQuery.Create(nil);
      ADOQSound.Connection:=DM_DATABASELINK.ADO_CDLINK;
      try
        with ADOQSound do
        begin
          close;
          sql.Clear;
          sql.Add('select Sound_File from FM_ALAMR_SOUND');
          sql.Add(' where SOUND_ID=:SID');      Parameters.ParamByName('SID').Value:= StrToInt(Trim(cxLV_Sound.Selected.Caption));      open;
          if not eof then
          begin
            TBlobField(FieldByName('Sound_File')).SavetoFile('C:\TempSound01.wav');   //保存流文件        sndplaysound(pchar('C:\TempSound01.wav'),snd_async);       //播放
            DeleteFile('C:\TempSound01.wav');                          //删除文件
          end
          else
          begin
            Application.MessageBox('该记录没有声音文件','成都超讯提醒您',MB_OK+MB_ICONWARNING);
          end;
        end;
      finally
        ADOQSound.Free;
      end;
    end;
      

  4.   

    郁闷,这个问题怎么在这里给了100分,我开始才回答了一个不过只有20分,好可惜哟unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls, DB, ADODB;type
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        Image1: TImage;
        OpenDialog1: TOpenDialog;
        ADOConnection1: TADOConnection;
        Button3: TButton;
        ADOQuery1: TADOQuery;
        Button4: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure Button4Click(Sender: TObject);
      private
        FS: TFileStream;
        MS: TMemoryStream ;
        SM: TStream;
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    var
      chFilePath : string;
    begin
      OpenDialog1.Filter := '图片|*.BMP';
      if OpenDialog1.Execute then
          chFilePath := OpenDialog1.FileName ;
      FS := TFileStream.Create(chFilePath,fmOpenRead);
      Image1.Picture.Bitmap.LoadFromStream(FS);
      FS.Free;
    end;procedure TForm1.Button2Click(Sender: TObject);
    //图片存放
    begin
      MS := TMemoryStream.Create ;
      Image1.Picture.Bitmap.SaveToStream(MS);
      Ms.Position := 0;
      AdoQuery1.Append;
      TBlobField(AdoQuery1.FieldByName('Pic')).LoadFromStream(MS);
      AdoQuery1.Post;
      Ms.Free;
      ShowMessage('Success');end;procedure TForm1.Button3Click(Sender: TObject);
    //图片读取
    begin
      try
        try
          SM := AdoQuery1.CreateBlobStream(AdoQuery1.FieldByName('Pic'),bmRead );
          if SM.Size > 0 then
            ShowMessage('有位图')
          else
            ShowMessage('无位图');
          Image1.Picture.Bitmap.LoadFromStream(SM);
        except
          raise Exception.Create('位图存放错误!');
        end;
      finally
        SM.Free;
      end;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      ADoConnection1.Connected  := True;
      AdoQuery1.SQL.Text := 'Select * From Pic';
      AdoQuery1.Open;
    end;procedure TForm1.Button4Click(Sender: TObject);
    //图片清除
    begin
      AdoQuery1.Edit;
      TBlobField(AdoQuery1.FieldByName('Pic')).Clear;
      AdoQuery1.Post;
      ShowMessage('清除成功');
    end;end.
      

  5.   

    把jpg或bmp保存为jpg:
    imInput为TImage类型  if Assigned(imInput.Picture.Graphic) then begin
        if SameText(ExtractFileExt(sFileName),'.jpg') then begin
          jpg := TJpegImage.Create;
          ms := TMemoryStream.Create;
          try
            jpg.LoadFromFile(sfileName);
            bmp.LoadFromClipboardFormat(cf_BitMap,ClipBoard.GetAsHandle(cf_Bitmap),0);
            jpg.SaveToStream(ms);
            (adoDataSet.FieldByName('PICTURE') as TBlobField).LoadFromStream(ms);
          finally
            ms.Free;
            jpg.Free;
          end;{try}
        end{if}
        else if ExtractFileExt(sFileName) = '.bmp' then begin
          jpg := TJpegImage.Create;
          bmp := TBitMap.Create;
          ms := TMemoryStream.Create;
          bmp.LoadFromClipboardFormat(cf_BitMap,ClipBoard.GetAsHandle(cf_BitMap),0);
          try
            jpg.Assign(bmp);
            jpg.SaveToStream(ms);
            (adoDataSet.FieldByName('PICTURE') as TBlobField).LoadFromStream(ms);
          finally
            ms.Free;
            bmp.Free;
            jpg.Free;
          end;{try}
        end;
      end;{if}
    读取jpg:        m_blob := adoDataSet.CreateBlobStream(adoDataSet.FieldByName('Picture'),bmRead);
            m_jpeg:=TJpegImage.Create;
            try
              if m_blob.Size<>0 then begin
                try
                  m_jpeg.LoadFromStream(m_blob);
                  imInput.Picture.Assign(m_jpeg);
                  ImInput.Refresh;
                except
                end;{try}
              end
              else
                imInput.Picture.Assign(nil);
            finally
              m_jpeg.Free;
              m_blob.Free;
            end;{try}
          end;{if}
        finally
          adoDataSet.Free;
        end;{try}从一个工程中copy的,给点分吧!