DBImage 使用 Jpeg 图片(VCL)

Delphi 的 DBImage 只支持 BMP 格式的图片。如果在数据库的 Blob 字段里面存储 BMP 图片,则 DBImage 可以自动显示图片。如果在 Blob 字段里面存储 Jpg 图片,则打开数据库的时候,如果绑定了一个 DBImage 到该字段,会报异常。


要让 DBImage 支持 JPEG,其核心是:TWICImage.

TWICImage 是 Delphi 10 以来新增加的一个类,在 Vcl.Graphics; 单元里面。这个类支持各种图片格式,包括 gif, png, jpg 等等。


Danny Wind 有两篇文章和一个 Demo 代码演示了如何使用 TWICImage 来达到让 Image 显示 JPG 图片的效果:


文章一


文章二


---------------

核心代码:

{Display info from image inside Blob}
procedure TFormMain.DisplayPictureInfo(Field: TBlobField);
var
  lWICImage: TWICImage;
begin
  MemoMain.Lines.Add('======================');
  if (Field.BlobSize > 0) then
  begin {Assume image}
    lWICImage := TWICImage.Create;
    try
      lWICImage.Assign(Field);
      MemoMain.Lines.Add('Picture inside BlobField:');
      MemoMain.Lines.Add('Size = ' + Field.BlobSize.ToString + ' bytes');
      MemoMain.Lines.Add('Format = ' + GetEnumName(TypeInfo(TWICImageFormat),Integer(lWICImage.ImageFormat)));
    finally
      lWICImage.Free;
    end;
  end
  else {Empty}
  begin
    MemoMain.Lines.Add('No picture, Blob is Empty');
    MemoMain.Lines.Add('Click on image to add a picture.');
  end;
end;


{TWICImage can determine image type from the header that was saved into the Blob.
 Note: TWICImage requires WIndows-XP SP3 and Delphi-2010.}
procedure TFormMain.LoadPictureFromField(Field: TBlobField; Picture: TPicture);
var
  lWICImage: TWICImage;
begin
  if (Field.BlobSize > 0) then
  begin {Assume image}
    lWICImage := TWICImage.Create;
    try
      lWICImage.Assign(Field);
      Picture.Assign(lWICImage);
    finally
      lWICImage.Free;
    end;
  end
  else {Empty}
  begin
    Picture.Assign(nil);
  end;
end;

上述函数的 Picture 来自一个 Image。因此就可以在一个 TImage 里面显示来自数据库字段的图片了。要让它自动显示,在 DataSource.OnDataChange 事件里面调用这个方法。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段代码应该是对图像进行 Laplace 锐化处理。具体实现过程如下: 1. 定义了图像的宽度和高度。其中,`IMAGEWIDTH` 和 `IMAGEHEIGHT` 分别代表图像的宽度和高度,都被定义为 80。 2. 定义了两个图像数据指针,`dbImage` 和 `dbTargetImage`。这两个指针指向两张图像的数据,均为 `unsigned char` 类型,大小为 `IMAGEWIDTH * IMAGEHEIGHT`。 3. 定义了一些变量,`mi` 和 `mj` 分别代表图像的行和列,`m_nWork1` 和 `m_nWork2` 用于计算 Laplace 算子的结果,`m_nWork` 为临时变量,`pWork` 为指向一个无符号整型数据的指针。 4. 定义了一些临时指针变量,`pImg1`、`pImg2`、`pImg3` 和 `pImg`,分别代表当前像素的上一行、当前行和下一行的指针,以及当前像素的指针。 5. 对 `dbTargetImage` 中的所有像素进行初始化,将其全部设置为 0。 6. 对 `dbImage` 中的像素进行遍历,进行 Laplace 锐化处理。具体处理过程如下: a. 获取当前像素的上一行、当前行和下一行的像素值,并计算 Laplace 算子的结果。 b. 如果 Laplace 算子的结果大于 255,则将其设置为 255;如果小于 0,则将其设置为 0。 c. 将计算出的结果写入 `dbTargetImage` 中的对应位置。 d. 更新当前像素的上一行、当前行和下一行的指针。 7. 最后,将 `dbTargetImage` 中的第一行和最后一行的像素值全部设置为 0。 总的来说,这段代码的作用就是对输入的图像进行 Laplace 锐化处理,并将处理后的图像保存在 `dbTargetImage` 中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值