您的位置:程序门 -> delphi -> 数据库相关



关于保存jpg图片的问题!


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


关于保存jpg图片的问题![已结贴,结贴人:yhyhai]
发表于:2007-09-24 11:11:45 楼主
我用access做数据库存储图片的字段类型为ole型
保存的代码如下:
var
      strm:   tmemorystream;
      myjpeg:   tjpegimage;
begin
//extname是一个全局变量,它通过extractfileext(openpicturedialog1.filename)获得扩展名;  
      if   (extname   =   '.jpg')   then
          begin
              clientdataset1.edit;
              strm   :=   tmemorystream.create;
              myjpeg   :=   tjpegimage.create;
              myjpeg.assign(image1.picture.graphic);
              myjpeg.savetostream(strm);
              strm.position   :=   0;
              tblobfield(clientdataset1.fieldbyname('相片')).loadfromstream(strm);
              strm.free;
              clientdataset1.post;
        end
end;  
每次保存是都提示"bitmap   image   is   not   valid"这是为什么?我该怎样做才行?谢谢!
发表于:2007-09-24 11:23:541楼 得分:1
字段类型不对吧
发表于:2007-09-24 11:26:482楼 得分:0
to   luxuewei5214  
我用流保存*.bmp文件没问题啊!
发表于:2007-09-24 11:57:213楼 得分:5
var
    stream:tmemorystream;
    jpg:tjpegimage;
begin
    try
        adoquery2.close;
        adoquery2.sql.clear;
        adoquery2.sql.add('');
        adoquery2.open;
        if   not   adoquery2.fieldbyname('pic').isnull   then   begin
            if   adoquery2.fieldbyname('pic_type').asinteger   =   2   then   begin
                try
                    stream:=tmemorystream.create;
                    jpg:=tjpegimage.create;
                    tblobfield(adoquery2.fieldbyname('pic')).savetostream(stream);         //   显示的转换为blobfield并保存到内存流
                    stream.position   :=0;
                    jpg.loadfromstream(stream);
                    image1.picture.assign(jpg);
                finally
                    stream.free;
                    jpg.free;
                end;
            end   else   if   adoquery2.fieldbyname('pic_type').asinteger   =   1   then   begin
                image1.picture.bitmap.assign(adoquery2.fieldbyname('pic'));
            end   else   begin
                image1.picture   :=   nil;
            end;
        end   else   begin
            image1.picture   :=   nil;
        end;
    except
        common.infomessage('提取图片数据失败!');
        exit;
    end;


var
    stream:tmemorystream;
    ext:string;
    pictype:   integer;
begin
    try
        try
            ext:=extractfileext(openpicturedialog1.filename);
            if   ext   =   ''   then   exit;
            if   uppercase(ext)   ='.bmp'   then   begin
                pictype   :=   1;
            end   else   if   (uppercase(ext)   =   '.jpeg')   or   (uppercase(ext)   =   '.jpg')   then   begin
                pictype   :=   2;
            end;
            stream   :=   tmemorystream.create;
            image1.picture.graphic.savetostream(stream);
            adoquery1.close;
            adoquery1.sql.clear;
            adoquery1.sql.add('update   member   set   pic   =:pic,pic_type   =:pictype   where   ---');
            adoquery1.parameters.parambyname('pic').loadfromstream(stream,ftblob);
            adoquery1.parameters.parambyname('pictype').value   :=   pictype;
            adoquery1.EXECsql;
        finally
            stream.free;
        end;
    except
        infomessage('保存图片失败!');
        exit;
    end;


给你个现成的,我的数据库是sql
发表于:2007-09-24 16:47:564楼 得分:0
to   rong451  
谢谢你的代码
可我想知道我的代码有何问题?
发表于:2007-09-24 16:57:585楼 得分:4
代码没有什么问题(myjpeg资源要释放),估计问题所在于你用   tdbimage   绑定到   tclientdataset   的   pic   字段进行显示图片,如有,把界面上的tdbimage删除或者把其datasource清空,然后再运行你的代码,确认问题所在。
发表于:2007-09-24 17:31:066楼 得分:0
to   lynmison  
你说的没错!确实是dbimage的问题,是不是dbimage不能显示jpg文件.
发表于:2007-09-24 17:33:107楼 得分:10
dbimage好像不能显示jpeg格式,你可以用image进行显示,简单的做法就是记录中增加图片格式信息,便于在显示的时候处理。


快速检索

最新资讯
热门点击