//显示图像
var
  g: TGPGraphics;
  img: TGPImage;
begin
  g := TGPGraphics.Create(Self.Canvas.Handle);   img := TGPImage.Create('c:\temp\x.jpg');   g.DrawImage(img,,); {参数2、3是坐标}   img.Free;
  g.Free;
end;

//按标准的高度与宽度显示图像
var
  g: TGPGraphics;
  img: TGPImage;
begin
  g := TGPGraphics.Create(Canvas.Handle);   img := TGPImage.Create('c:\temp\x.jpg');   g.DrawImage(img, , , img.GetWidth, img.GetHeight);   img.Free;
  g.Free;
end;

//按指定高度与宽度显示图像
var
  g: TGPGraphics;
  img: TGPImage;
begin
  g := TGPGraphics.Create(Canvas.Handle);   img := TGPImage.Create('c:\temp\x.jpg');   g.DrawImage(img, , , , );   img.Free;
  g.Free;
end;

//略缩图
var
  g : TGPGraphics;
  img, imgSmall: TGPImage;
begin
  g := TGPGraphics.Create(Canvas.Handle);
  img:= TGPImage.Create('c:\temp\x.jpg');   imgSmall := img.GetThumbnailImage(, , nil, nil);
  g.DrawImage(imgSmall, , , imgSmall.GetWidth, imgSmall.GetHeight);   img.Free;
  imgSmall.Free;
  g.Free;
end;

//图片平行四边形变换
var
  g: TGPGraphics;
  img: TGPImage;
const
  pts: array[..] of TGPPoint = ((x:; y:),
                                  (x:; y:),
                                  (x:; y:));
begin
  g := TGPGraphics.Create(Canvas.Handle);
  img:= TGPImage.Create('c:\temp\x.jpg');   g.DrawImage(img, , ); {这是原始图片}   g.DrawImage(img, PGPPoint(@pts), );
  {反复测试后, 感悟如下:
    1、只需要 3 个点来控制图片, 不能多或少.
    2、点 1 控制右上角; 点 2 控制左上角; 点 3 控制右下角.
    3、因为是平行四边形, 所以剩下的左下角的点(就是右上角的对角点)程序就可以算得出来了.
  }   img.Free;
  g.Free;
end;

//图像缩放时的算法比对
var
  g: TGPGraphics;
  img: TGPImage;
  w, h: UINT;
begin
  g := TGPGraphics.Create(Canvas.Handle);
  img:= TGPImage.Create('c:\temp\x.jpg');
  w  := img.GetWidth;
  h := img.GetHeight;   g.DrawImage(img, MakeRect(, , w, h), , , w, h, UnitPixel);   g.SetInterpolationMode(InterpolationModeNearestNeighbor);
  g.DrawImage(img, MakeRect(, , 0.6*w, 0.6*h), , , w, h, UnitPixel);   g.SetInterpolationMode(InterpolationModeHighQualityBilinear);
  g.DrawImage(img, MakeRect(, , 0.6*w, 0.6*h), , , w, h, UnitPixel);   g.SetInterpolationMode(InterpolationModeHighQualityBicubic);
  g.DrawImage(img, MakeRect(, , 0.6*w, 0.6*h), , , w, h, UnitPixel);   img.Free;
  g.Free;
end;

缩放或旋转图像时的算法选项:

Delphi 微软 说明
InterpolationModeBicubic Bicubic 指定双三次插值法。不进行预筛选。将图像收缩为原始大小的 25% 以下时,此模式不适用。
InterpolationModeBilinear Bilinear 指定双线性插值法。不进行预筛选。将图像收缩为原始大小的 50% 以下时,此模式不适用。
InterpolationModeDefault Default 指定默认模式。
InterpolationModeHigh High 指定高质量插值法。
InterpolationModeHighQualityBicubic HighQualityBicubic 指定高质量的双三次插值法。执行预筛选以确保高质量的收缩。此模式可产生质量最高的转换图像。
InterpolationModeHighQualityBilinear  HighQualityBilinear  指定高质量的双线性插值法。执行预筛选以确保高质量的收缩。
InterpolationModeInvalid Invalid 等效于 QualityMode 枚举的 Invalid 元素。
InterpolationModeLow Low 指定低质量插值法。
InterpolationModeNearestNeighbor NearestNeighbor 指定最临近插值法。

GDI+ 学习记录(26): 显示图像 - Image的更多相关文章

  1. libgdx学习记录26——Polygon多边形碰撞检测

    libgdx中Math封装了Polygon这个类,它是由多个定点进行描述实现的,在进行物体间的碰撞时,物体轮廓有时候是不规则的,这时候可以用一个多边形勾勒出其大概的轮廓,对其进行模拟. Polygon ...

  2. UWP学习记录9-设计和UI之控件和模式6

    UWP学习记录9-设计和UI之控件和模式6 1.图形和墨迹 InkCanvas是接收和显示墨迹笔划的控件,是新增的比较复杂的控件,这里先不深入. 而形状(Shape)则是可以显示的各种保留模式图形对象 ...

  3. UWP学习记录8-设计和UI之控件和模式5

    UWP学习记录8-设计和UI之控件和模式5 1.日历.日期和时间控件 日期和时间控件提供了标准的本地化方法,可供用户在应用中查看并设置日期和时间值. 有四个日期和时间控件可供选择,选择的依据如下: 日 ...

  4. Echarts学习记录——如何去掉网格线及网格区域颜色

    关键属性 splitLine和splitArea,可以设置相关的属性 示例代码 <!DOCTYPE html> <html lang="en"> <h ...

  5. Echarts学习记录——如何给x轴文字标签添加事件

    Echarts学习记录——如何给x轴文字标签添加事件 关键属性 axisLabel下属性clickable:true 并给图表添加单击事件 根据返回值判断点击的是哪里 感觉自己的方法有点变扭,有更好办 ...

  6. MyBatis 学习记录5 MyBatis的二级缓存

    主题 之前学习了一下MyBatis的一级缓存,主要涉及到BaseExecutor这个类. 现在准备学习记录下MyBatis二级缓存. 配置二级缓存与初始化发生的事情 首先二级缓存默认是不开启的,需要自 ...

  7. JavaScript学习记录一

    title: JavaScript学习记录一 toc: true date: 2018-09-11 18:26:52 --<JavaScript高级程序设计(第2版)>学习笔记 要多查阅M ...

  8. git原理学习记录:从基本指令到背后原理,实现一个简单的git

    一开始我还担心 git 的原理会不会很难懂,但在阅读了官方文档后我发现其实并不难懂,似乎可以动手实现一个简单的 git,于是就有了下面这篇学习记录. 本文的叙述思路参照了官方文档Book的原理介绍部分 ...

  9. Java 8 学习记录

    Java 8 学习记录 官方文档 https://docs.oracle.com/javase/8/ https://docs.oracle.com/javase/8/docs/index.html ...

随机推荐

  1. Eclipse中设置作者日期等信息

    在使用Eclipse 编写Java代码时,自动生成的注释信息都是按照预先设置好的格式生成的,例如其中author 的属性值. 我们可以在Eclipse 中进行设置自己希望显示的信息. 现在看看如何修改 ...

  2. 【BZOJ 1013】 [JSOI2008]球形空间产生器sphere

    Description 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧毁 ...

  3. python学习笔记29(python中堆的使用)

    堆(heap):优先队列的一种,使用优先队列能够以任意顺序增加对象,并且能在任意时间(可能在增加对象的同时)找到(也可能是移除)最小元素,比用于列表中min的方法要高效. Python中并没有独立的堆 ...

  4. 机器学习基石的泛化理论及VC维部分整理(第六讲)

    第六讲 第五讲主要讲了机器学习可能性,两个问题,(1)\(E_{in} 要和 E_{out}\) 有很接近,(2)\(E_{in}\)要足够小. 对于第一个假设,根据Hoefding's Inequa ...

  5. lua通过bunlde读注意事项

    把lua脚本做成bundle,加载字符串,变成lua对象: lua loadstring("name")() 注意:loadstring的问题: 无法访问全局local变量,需要改 ...

  6. MSMQ(消息队列)

    前段时间研究WCF接触到了MSMQ,所以认真的学习了一下,下面是我的笔记. 我理解的MSMQ MSMQ可以被看成一个数据储存装置,就如同数据库,只不过数据存储的是一条一条的记录,而MSMQ存储的是一个 ...

  7. Android支付接入(五):机锋网

    原地址:http://blog.csdn.net/simdanfeg/article/details/9012083 前边已经陆续跟大家走了一遍运营商和支付宝付费接入,今天跟大家一起看看机锋网的支付接 ...

  8. TaskTracker获取并执行map或reduce任务的过程(一)

    我们知道TaskTracker在默认情况下,每个3秒就行JobTracker发送一个心跳包,也就是在这个心跳包中包含对任务的请求.JobTracker返回给TaskTracker的心跳包中包含有各种a ...

  9. WAF SSI

    http://www.2cto.com/Article/201405/299154.html

  10. 如何在CHROME里调试前端代码?

    以前看前端们调得很神的, 刚看书到这里,作一个记录,演练了一下,确实有点神!!! :) <!DOCTYPE html> <html lang="en"> & ...