程序需要将图片存入数据库,但是图片比较大,在后续的处理工作中比较麻烦,考虑生成缩略图。
但是我在做的时候发现,网上的一般做法,在imageEn控件下面没办法实现。使用ImageEn控件是因为它能支持多种图像格式。请教各位大侠有没有什么好的方法来实现缩略图,并存入sqlserver数据库。 谢谢!

解决方案 »

  1.   

    存SQL SERVER 数据库用   Image字段我没有用过ImageEN控件,一般我就用DBImage如果图片的格式较大,BMP可以用Stretchblt进行压缩。
      

  2.   

    我是用的Image字段存储的,因为要求支持多种格式,所以就用了ImageEN现在是求一种缩略图生成的方法,我在网上查到的方法一般都是类似:
    bmp.Canvas.StretchDraw(Rect(0,0,Width,Height), SourceJpg);好像只能支持bmp,jpg其他格式就不行,而且在ImageEN控件下面没有作用。
      

  3.   

    delphi下面没有其他方法来实现缩略图吗? 
    如果转换格式的话,除了bmp,jpg的转换,其他格式做起来好像都比较麻烦。能不能给2个一般做缩略图的方法,我看看是不是我哪里做的有问题。。
      

  4.   

    使用GDI+很方便的:var
      bmp: TGpImage;
      ThumbImage: TGpImage;
      g: TGpGraphics;
    begin
      bmp := TGpBitmap.Create('D:\GdiplusC\Media\msn.jpg');
      ThumbImage := bmp.GetThumbnailImage(64, 64); // 获得缩略图
      g := TGpGraphics.Create(Canvas.Handle);
      g.DrawImage(ThumbImage, 0, 0); // 显示缩略图
      g.Free;
      ThumbImage.Free;
      bmp.Free;
    end;
      

  5.   

    to:maozefa(阿发伯)
    GDI+支持BMP,JPG之外的格式吗?
      

  6.   

    使用GDI+生成缩略图,并保存到数据字段
    var
      bmp: TGpImage;
      ThumbImage: TGpImage;
      Adapter: TStreamAdapter;
      Stream: TMemoryStream;
      Clsid: TGUID;
    begin
      bmp := TGpBitmap.Create('D:\GdiplusC\Media\msn.jpg');
      ThumbImage := bmp.GetThumbnailImage(64, 64); // 获得缩略图
      Stream := TMemoryStream.Create;
      Adapter := TStreamAdapter.Create(Stream, soOwned);
      GetEncoderClsid('image/jpeg', Clsid);
      ThumbImage.Save(Adapter, Clsid);
      Stream.Position := 0;
      // 保存缩略图到二进制数据字段,假定你的字段名为BlobField
      BlobField.LoadFromStream(Stream);    
      ThumbImage.Free;
      bmp.Free;
    end;
      

  7.   


    to:maozefa(阿发伯) 
    GDI+支持BMP,JPG之外的格式吗?我没用过GDI+
    我怎么样才可以使用GDI+,需要安装相关控件吗? 
     
      

  8.   

    请参考我的文章,里面有下载地址及BUG修改方法:
    http://blog.csdn.net/maozefa/archive/2007/11/12/1880484.aspx
    使用时uses Gdiplus;
      

  9.   

    提醒一句,用上面方法保存到数据库后,用DBImage显示出来图像是倒的,可以这样保存(没测试):
    var
      bmp: TGpImage;
      ThumbImage: TGpImage;
      Stream: TMemoryStream;
      Bitmap: TBitmap;
    begin
      bmp := TGpBitmap.Create('D:\GdiplusC\Media\msn.jpg');
      ThumbImage := bmp.GetThumbnailImage(64, 64); // 获得缩略图
      Bitmap := TBitmap.Create;
      Bitmap.Handle := TGpBitmap(ThumbImage).GetHBitmap(0);
      Bitmap.SaveToStream(Stream);
      Stream.Position := 0;
      // 保存缩略图到二进制数据字段,假定你的字段名为BlobField
      BlobField.LoadFromStream(Stream);
      Bitmap.Free;    
      ThumbImage.Free;
      bmp.Free;
    end;
      

  10.   

    上面的代码掉了:Stream := TMemoryStream.Create;
    及Stream.Free;
      

  11.   

    呵呵,我多虑了,因为是用流操作的,前面用GDI+保存到数据库的缩略图用DBImage显示不会是倒的。
      

  12.   

    数据库里要保存那么多格式干什么?写入数据库时,全部转换成JPG,不是很好吗?