文档章节

GdiPlus[50]: 图像(二) 关于 Create

涂孟超
 涂孟超
发布于 2014/09/26 15:37
字数 932
阅读 4
收藏 0
点赞 0
评论 0

IGPImage 类提供的 Create 方法:

Image := TGPImage.Create(文件(或流), Boolean);
//其中的布尔值默认 False; 如果为 True 则使用文件(或流)中的已嵌入颜色管理信息来进行颜色校正.

{ 示例1: 从文件建立 }
var
  Graphics: IGPGraphics;
  Image: IGPImage;
begin
  Image := TGPImage.Create('C:\GdiPlusImg\Grapes.jpg');
  Graphics := TGPGraphics.Create(Handle);
  Graphics.DrawImage(Image, 10, 10);
end;

{ 示例2: 从流(IStream)建立 }
const
  path = 'C:\GdiPlusImg\Grapes.jpg';
var
  Graphics: IGPGraphics;
  Image: IGPImage;
  Stream: IStream; { IStream 声明中 ActiveX 单元 }
begin
  Stream := TStreamAdapter.Create(TFileStream.Create(path, fmOpenRead), soOwned);
  Image := TGPImage.Create(Stream);
  Graphics := TGPGraphics.Create(Handle);
  Graphics.DrawImage(Image, 10, 10);
end;

 
 
 
 
 

 

 

  

IGPBitmap 类提供的 Create 方法:

// 1. 作为 IGPImage 继承者, IGPBitmap 也可以使用 IGPImage 的建立方法; 另外:

// 2. 可以指定宽度、高度和像素格式, 像素格式默认 PixelFormat32bppARGB:
var
  Bitmap: IGPBitmap;
begin
  Bitmap := TGPBitmap.Create(100, 100);
  ShowMessage(IntToStr(Bitmap.PixelFormat)); { 2498570 }
  
  Bitmap := TGPBitmap.Create(100, 100, PixelFormat32bppARGB);
  ShowMessage(IntToStr(Bitmap.PixelFormat)); { 2498570 }
end;

// 3. 可以指定宽度、高度和 Graphics(使用其分辨率):
var
  Graphics: IGPGraphics;
  Bitmap: IGPBitmap;
  bx,by,gx,gy: Single;
begin
  Graphics := TGPGraphics.Create(Canvas.Handle);
  Bitmap := TGPBitmap.Create(100, 100, Graphics);

  bx := Bitmap.HorizontalResolution;
  by := Bitmap.VerticalResolution;
  gx := Graphics.DpiX;
  gy := Graphics.DpiY;
  ShowMessageFmt('%g:%g; %g:%g', [bx, by, gx, gy]); {96:96; 96:96}
end;

// 4. 从另一个图像采集像素建立:
var
  Graphics: IGPGraphics;
  BitmapTmp, Bitmap: IGPBitmap;
  Brush: IGPSolidBrush;
  Rect: TGPRect;
  BitmapData: TGPBitmapData;
begin
  BitmapTmp := TGPBitmap.Create(16, 16);
  Graphics := TGPGraphics.Create(BitmapTmp);
  Brush := TGPSolidBrush.Create(0);
  Brush.Color := $FFFF0000;
  Graphics.FillRectangle(Brush, 0, 0, 8, 16);
  Brush.Color := $FF0000FF;
  Graphics.FillRectangle(Brush, 8, 0, 8, 16);

  Rect.Initialize(0, 0, BitmapTmp.Width, BitmapTmp.Height);
  BitmapData := BitmapTmp.LockBits(Rect, [ImageLockModeRead], BitmapTmp.PixelFormat);
  
  Bitmap := TGPBitmap.Create(100, 100, 4, PixelFormat32bppARGB, BitmapData.Scan0);
  Graphics := TGPGraphics.Create(Handle);
  Graphics.DrawImage(Bitmap, 10, 10);

  BitmapTmp := TGPBitmap.Create(16, 16);
end;

// 5. 从 HBITMAP 建立:
var
  Graphics: IGPGraphics;
  Bitmap: IGPBitmap;
  bit: TBitmap;
begin
  bit := TBitmap.Create;
  bit.LoadFromFile('C:\GdiPlusImg\Bird.bmp');
  Bitmap := TGPBitmap.Create(bit.Handle, bit.Palette);
  bit.Free;

  Graphics := TGPGraphics.Create(Handle);
  Graphics.Clear($FFFFFFFF);
  Graphics.DrawImage(Bitmap, 10, 10);
end;

// 6. 从 HICON 建立:
var
  Graphics: IGPGraphics;
  Bitmap: IGPBitmap;
begin
  Bitmap := TGPBitmap.Create(Application.Icon.Handle);
  Graphics := TGPGraphics.Create(Handle);
  Graphics.DrawImage(Bitmap, 10, 10);
end;

// 7. 从资源文件中的图片(好像只能是 bmp)建立(假定已添加一张命名为 Bitmap_1 的资源图片):
var
  Graphics: IGPGraphics;
  Bitmap: IGPBitmap;
begin
  Bitmap := TGPBitmap.Create(HInstance, 'Bitmap_1');
  Graphics := TGPGraphics.Create(Handle);
  Graphics.DrawImage(Bitmap, 10, 10);
end;

// 8. 还可以通过 TBitmapInfo 建立.
// 9. DirectDrawSurface7 建立; 这是不是让 GDI+ 和 DirectX 结合的起点呢? 找时间再学习.

 
 
 
 
 

 

 

  

IGPMetafile 类提供的 Create 方法:

// 1. 作为 IGPImage 继承者, IGPMetafile 也可以使用 IGPImage 的建立方法:
var
  Graphics: IGPGraphics;
  Metafile: IGPMetafile;
begin
  Metafile := TGPMetafile.Create('C:\GdiPlusImg\SampleMetafile.emf');
  Graphics := TGPGraphics.Create(Handle);
  Graphics.DrawImage(Metafile, 10, 10);
end;

// 2. 从文件建立并绘图(文件不存在则建立, 存在则覆盖; 此时必须同时指定 HDC):
var
  GraphicsMeta, Graphics: IGPGraphics;
  Metafile: IGPMetafile;
  Pen: IGPPen;
begin
  Metafile := TGPMetafile.Create('C:\GdiPlusImg\Test.emf', Canvas.Handle);
  GraphicsMeta := TGPGraphics.Create(Metafile);
  Pen := TGPPen.Create($80FF0000);
  GraphicsMeta.DrawRectangle(Pen, 0, 0, 50, 30);
  GraphicsMeta := nil; { 这样才结束绘图 }
  
  Graphics := TGPGraphics.Create(Handle);
  Graphics.DrawImage(Metafile, 10, 10);
end;

// 3. 可在建立是指定文件尺寸; 此时最好同时指定尺寸的单位, 否则默认单位是: MetafileFrameUnitGdi
var
  GraphicsMeta, Graphics: IGPGraphics;
  Metafile: IGPMetafile;
  Pen: IGPPen;
  Rect: TGPRect;
begin
  Rect.Initialize(0, 0, 100, 100);
  Metafile := TGPMetafile.Create(Canvas.Handle, Rect, MetafileFrameUnitPixel);
  GraphicsMeta := TGPGraphics.Create(Metafile);
  Pen := TGPPen.Create($80FF0000);
  GraphicsMeta.DrawRectangle(Pen, 0, 0, 50, 30);
  GraphicsMeta := nil;
  Text := Format('%d, %d', [Metafile.Width, Metafile.Height]); 
  
  Graphics := TGPGraphics.Create(Handle);
  Graphics.DrawImage(Metafile, 10, 10);
end;

// 4. 可指定图元文件类型:
var
  GraphicsMeta, Graphics: IGPGraphics;
  Metafile: IGPMetafile;
  Pen: IGPPen;
begin
  Metafile := TGPMetafile.Create(Canvas.Handle, EmfTypeEmfPlusOnly);
  GraphicsMeta := TGPGraphics.Create(Metafile);
  Pen := TGPPen.Create($80FF0000);
  GraphicsMeta.DrawRectangle(Pen, 0, 0, 50, 30);
  GraphicsMeta := nil;
  Text := Format('%d, %d', [Metafile.Width, Metafile.Height]); 
  
  Graphics := TGPGraphics.Create(Handle);
  Graphics.DrawImage(Metafile, 10, 10);
end;

{ 图元文件有三种类型: }
// EmfOnly     文件中所有记录都是 EMF 记录, 可通过 GDI 或 GDI+ 显示.
// EmfPlusOnly 文件中所有记录都是 EMF+ 记录, 可通过 GDI+ 显示, 而不能通过 GDI 显示. 
// EmfPlusDual 文件中所有记录都是双份的(EMF+ 与 EMF), 可通过 GDI 或 GDI+ 显示. 

// 5. 可在建立是写入描述文本:
var
  GraphicsMeta, Graphics: IGPGraphics;
  Metafile: IGPMetafile;
  Pen: IGPPen;
begin
  Metafile := TGPMetafile.Create(Canvas.Handle, EmfTypeEmfPlusOnly, 'Description_123');
  GraphicsMeta := TGPGraphics.Create(Metafile);
  Pen := TGPPen.Create($80FF0000);
  GraphicsMeta.DrawRectangle(Pen, 0, 0, 50, 30);
  GraphicsMeta := nil;

  Graphics := TGPGraphics.Create(Handle);
  Graphics.DrawImage(Metafile, 10, 10);
end;

// 图元文件的建立参数还有很多花样, 基本就是这些东西的组合.

 
 
 
 
 

 

 

  

还有一些 From... 函数和 Create 是一样的:
Image := TGPImage.FromFile();
Image := TGPImage.FromStream();

Bitmap := TGPBitmap.FromFile();
Bitmap := TGPBitmap.FromStream();
Bitmap := TGPBitmap.FromDirectDrawSurface7();
Bitmap := TGPBitmap.FromBitmapInfo();
Bitmap := TGPBitmap.FromHBitmap();
Bitmap := TGPBitmap.FromHIcon();
Bitmap := TGPBitmap.FromResource();

Metafile := TGPMetafile.FromFile();
Metafile := TGPMetafile.FromStream();

 
 
 
 
 

 

 

  

本文转载自:http://www.cnblogs.com/del/archive/2009/12/28/1633951.html

共有 人打赏支持
涂孟超
粉丝 12
博文 2004
码字总数 14107
作品 0
深圳
程序员
MFC用GDI+动感歌词的制作

源代码:http://download.csdn.net/detail/nuptboyzhb/4219669 源代码: 1. 插入一个对话框的资源,删除默认控件,并为对话框创建一个类,命名为ClyricDlg; 2. 在对话框的头文件中添加GDI+相...

长平狐 ⋅ 2012/10/08 ⋅ 0

Wine 1.1.21 发布

Wine 1.1.21 现已发布。本版本主要带来了以下改进: 初步支持 shader model 4 能够从 X11 程序中复制/粘贴图像 对 GDIPlus 进行了改善 winemaker 支持 64 位 有关此版本的更新详情,可以查阅...

红薯 ⋅ 2009/05/10 ⋅ 0

VC实现多格式图像的转换

色彩鲜艳漂亮的高品质图像,一个个形象生动的Windows图标,高速运动、活灵活现的三维动画,这些无一不显示出程序设计者的艺术才华。在程序设计中,图像处理已经成为每个程序员的必修课。 在V...

余二五 ⋅ 2017/11/06 ⋅ 0

DotNetCore跨平台~System.DrawingCore部署Linux需要注意的

你在windows上使用图像组件没有任务问题,但部署到linux之后,将注意以下几点: 安装nuget包ZKWeb.System.Drawing 项目里还是引用System.DrawingCore,这点不用改 安装gdiplus插件,这个需要...

mcy247 ⋅ 2017/12/05 ⋅ 0

GDI+图像处理学习笔记——改变图像的透明度

GDI+是WindowsXp和windows Server 2003中的一个子系统,主要用于处理系统的绘制消息。GDI+是GDI的扩展,其继承了GDI的有点并在其基础上进行了改进,包括增加了一些GDI无法绘制的图形函数,同...

晨曦之光 ⋅ 2012/05/23 ⋅ 0

GDI+里面的问题。。。。。。。。。。

error C2248: “Gdiplus::Bitmap::Bitmap”: 无法访问 private 成员(在“Gdiplus::Bitmap”类中声明) 1> c:program filesmicrosoft sdkswindowsv7.0aincludegdiplusheaders.h(630) : 参见“G......

xxdd ⋅ 2013/10/24 ⋅ 0

MFC边框重绘

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 pragma once incl......

江河海流 ⋅ 2016/01/30 ⋅ 0

vs 2005 添加GDI配置

在VS2005当中由于自带了GDI+的开发包,所以不需要在安装GDI开发包,这些头文件的位置由VS中的$(WindowsSdkDir)/include自动包含进来了 下午自己添加了好几次,总是出现有报错,,在 stdafx.h...

种地瓜 ⋅ 2015/12/08 ⋅ 0

VS2008中使用GDI+

include <objbase.h> #include <gdiplus.h> #pragma comment(lib, "gdiplus.lib") using namespace Gdiplus; 定义全局 无符号长整形指针 ULONGPTR 如 ULONGPTR gdiplusupToken; 在构造函数里......

ryany ⋅ 2011/03/20 ⋅ 0

VC中使用GDI+实现为按钮加载Png图片

VC中使用GDI+实现为按钮加载Png图片 作者:flyfish 2010-3-15 一、在stdafx.h文件中添加头文件,命名空间,库的引用, #include usingnamespaceGdiplus; #pragmacomment( lib, "gdiplus.lib"...

冯京宝 ⋅ 2010/10/31 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Thrift RPC实战(二) Thrift 网络服务模型

TServer类层次体系 TSimpleServer/TThreadPoolServer是阻塞服务模型 TNonblockingServer/THsHaServer/TThreadedSelectotServer是非阻塞服务模型(NIO) 1 TServer抽象类的定义 内部静态类Args的...

lemonLove ⋅ 13分钟前 ⋅ 0

vim命令用法

第五章 vim命令 vim和vi几乎是一样的,唯一的区别就是当编辑一个文本时,使用vi不会显示颜色,而使用vim会显示颜色。 vim有三个模式:一般模式,编辑模式,命令模式。 系统最小化安装时没有安...

弓正 ⋅ 15分钟前 ⋅ 0

MyBatis源码解读之配置

1. 目的 本文主要介绍MyBatis配置文件解析,通过源码解读mybatis-config.xml(官方默认命名)、Mapper.xml 与Java对象的映射。 2. MyBatis结构 查看大图 MyBatis结构图,原图实在太模糊了,所以...

无忌 ⋅ 19分钟前 ⋅ 0

Ignite的jdbc与网格的连接方式的查询性能对比

环境: 数据量100万 Ignite2.5 Windows10 8g jdbc方式连接 import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; i......

仔仔1993 ⋅ 33分钟前 ⋅ 0

收集自网络的wordpress 分页导航的代码教程(全网最全版)

wordpress 分页导航是用来切换文章的一个功能,添加了 wordpress 分页导航后,用户即可自由到达指定的页面数浏览分类文章,而这样的一个很简单功能却有很多朋友在用插件:WP-PageNavi,插件的...

Rhymo-Wu ⋅ 49分钟前 ⋅ 0

微服务 WildFly Swarm 入门

Hello World 就像前面章节中的其他框架一样,我们希望添加一些基本的 Hello-world 功能,然后在其上逐步添加更多的功能。让我们从在我们的项目中创建一个 HolaResources 开始。您可以使用您的...

woshixin ⋅ 56分钟前 ⋅ 0

Maven的安装和Eclipse的配置

1. 下载Maven 下载地址 2. 解压压缩包,放到自己习惯的硬盘中 此处我将其放到了 D:\Tools 目录下。 3. 配置环境变量 右键此电脑 -> 属性 -> 高级系统设置 -> 环境变量。 在系统变量中新建,变...

影狼 ⋅ 今天 ⋅ 0

python pip使用国内镜像的方法

国内源 清华:https://pypi.tuna.tsinghua.edu.cn/simple 阿里云:http://mirrors.aliyun.com/pypi/simple/ 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/ 华中理工大学:http://......

良言 ⋅ 今天 ⋅ 0

对于url变化的spa应该如何使用微信jssdk

使用vue单页面碰上微信jssdk config验证失败的坑。第一次成功 之后切换页面全部失败,找到了解决方法,第一次验证成功后保存验证信息 切换页面时验证信息直接拿来用,加一个wx.error() 失败时...

孙冠峰 ⋅ 今天 ⋅ 0

Spring Cloud Gateway 一般集成

SCF发布,带来很多新东西,不过少了点教程,打开方式又和以前的不一样,比如这个SCG,压根就没有入门指导,所以这里写一个,以备后用。 一、集成 pom.xml <dependency> <groupI...

kut ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部