zoukankan      html  css  js  c++  java
  • Delphi GDI+基本用法总结

    GDI+以前只是听说过,还没怎么用过,这段时间用了用,觉得挺好用的.在这里总结一下.留个备忘. 
    GDI+(Graphics Device Interface plus)是Windows XP中的一个子系统,它主要负责在显示屏幕和打印设备输出有关信息,它是一组通过C++类实现的应用程序编程接口。由于它是图形绘制相关的接口,那先了解一下常用的几种图片格式.

    常见的图片格式

    常见的图片格式有JPEG, BMP, PNG. 
    JPEG:它用有损压缩方式去除冗余的图像或彩色数据, 获取得极高的压缩率的同时展现了十分丰富生动的图像.应用最为广泛.引用JPEG单元, 通TJPEGimage类进行读取. 
    BMP:它是bitmap(位图)的简称, 它是window操作系统中标准图像文件格式,能够被多种window应用程序支持,特点在于包含的图像信息丰富,几乎不进行压缩, 但是因为这个,它占用的空间比较大.Delphi里TImage里需要的格式就是BMP.引用Graphics单元, 通过TBitmap进行读取. 
    PNG: 它是新兴的网络图像格式, 是目前最不失真的格式, 相对于除BMP格式外.需要提到的它支持透明图像的制作.这样就可以实现在图像上加水印的功能.引用pngImage单元, 通过TPNGImage类可以加载PNG图像.

    不同图片格式的转换

    PNG转换成Bitmap

    var
      oBitMap: TBitMap;
      oPNG: TPNGImage;
    begin
      strFileName := '1.png';
      oBitMap := TBitMap.Create;
      oPNG := TPNGImage.Create;
      try
        oPng.LoadFromFile(strFileName);
        oBitMap.Width := 100;
        oBitMap.Height := 200;
        oBitMap.Canvas.Draw(0, 0, oPng);
      finally
        oBitMap.Free;
        oPng.Free;
      end;
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    BMP转换成IStream

      oBitMap := TBitMap.Create;
      try
        oBitmap.loadFromFile('1.bmp');
        oStream := TMemoryStream.Create;
        try
          oBitmap.SaveToStream(oStream);
          oStream.Position := 0;
          oStreamAdapter := TStreamAdapter.Create(oStream);
          // do something
        finally
          oStream.free;
          oStreamAdapter := nil; //需要注意,不能直接Free, 是接口,带有引用计数
        end;
      finally
        oBitmap.free;
      end;

    GDI+的基本用法

    引用GDIPOBJGDIPAPI这两个单元, 需要在开始之前需要调用调用初始化方法, 主要是加载dll及初始化相关的方法. 
    基本用法如下:

      oImage1 := TGPImage.Create('Photo_1.jpg');
      oImage2 := TGPImage.Create('Photo_2.jpg');
      oImage3 := TGPImage.Create('Photo_3.jpg');
      oImage4 := TGPImage.Create('Photo_4.jpg');
      g1 := TGPGraphics.Create(image1.Canvas.Handle);
      g1.DrawImage(oImage1, 0, 0, oImage1.GetWidth, oImage1.GetHeight);
      g1.DrawImage(oImage2, oImage1.GetWidth, 0, oImage2.GetWidth, oImage2.GetHeight);
      g1.DrawImage(oImage3, 0, oImage1.GetHeight, oImage3.GetWidth, oImage3.GetHeight);
      g1.DrawImage(oImage4, oImage1.GetWidth, oImage1.GetHeight, oImage4.GetWidth, oImage4.GetHeight);

    上面的代码相当于是把四幅图画在一幅图上.其它的一些用法参考TGPGraphics相关接口.

    http://blog.csdn.net/hpjx1987/article/details/51056978

  • 相关阅读:
    多线程、方便扩展的Windows服务程序框架
    C#并行开发_Thread/ThreadPool, Task/TaskFactory, Parallel
    C#并行编程-Task
    C#线程篇---Task(任务)和线程池不得不说的秘密(5)
    C# 线程知识--使用Task执行异步操作
    C# 线程池执行操作例子
    c#子线程执行完怎么通知主线程
    C#子线程执行完后通知主线程
    再送一波干货,测试2000线程并发下同时查询1000万条数据库表及索引优化
    熵的函数为什么用H,而熵的英文是entropy,好像没关系。实际原因是
  • 原文地址:https://www.cnblogs.com/findumars/p/5947583.html
Copyright © 2011-2022 走看看