zoukankan      html  css  js  c++  java
  • 再学 GDI+[90]: TGPImage(10) 获取图像的调色板信息

    本例效果图:



    代码文件:
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Grids;
    
    type
      TForm1 = class(TForm)
        DrawGrid1: TDrawGrid;
        OpenDialog1: TOpenDialog;
        Button1: TButton;
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure FormPaint(Sender: TObject);
        procedure Button1Click(Sender: TObject);
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    uses GDIPOBJ, GDIPAPI, Math;
    
    var
      img: TGPImage;
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      {调整 DrawGrid1 显示效果}
      with DrawGrid1 do
      begin
        Align := alRight;
        Width := 180;
        FixedCols := 0;
        FixedRows := 0;
        DefaultColWidth := 10;
        DefaultRowHeight := 10;
        ColCount := 0;
        RowCount := 1;
        DefaultDrawing := False;
        ScrollBars := ssNone;
      end;
    
      Button1.Left := ClientWidth - DrawGrid1.Width - Button1.Width;
      Button1.Top := 0;
    
      img := TGPImage.Create;
    end;
    
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
      img.Free;
    end;
    
    procedure TForm1.FormPaint(Sender: TObject);
    var
      g: TGPGraphics;
    begin
      g := TGPGraphics.Create(Self.Canvas.Handle);
      g.DrawImage(img, 0, 0, img.GetWidth, img.GetHeight);
      g.Free;
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    var
      Palette: PColorPalette; {调色板指针}
      ColorNum: Integer;      {调色板中的颜色总数}
      Colors: PGPColor;       {调色板中的颜色数组指针}
      i: Integer;
    begin
      OpenDialog1.Filter := 'All (*.png;*.gif;*.bmp;*.tif;*.jpg)|*.png;*.gif;*.bmp;*.tif;*.jpg';
      if not OpenDialog1.Execute then Exit;
      img.Free;
      img := TGPImage.Create(OpenDialog1.FileName);
    
      Text := ExtractFileName(OpenDialog1.FileName);
    
      {为调色板分配内存}
      GetMem(Palette, img.GetPaletteSize);
      {获取调色板数据}
      img.GetPalette(Palette, img.GetPaletteSize);
    
      DrawGrid1.ColCount := 0;
      DrawGrid1.RowCount := 1;
    
      if Palette^.Count = 0 then
      begin
        ShowMessage('此图片没有调色板');
        Exit;
      end;
    
      ColorNum := Palette^.Count;
      Colors := @Palette.Entries; {调色板中颜色数组的指针}
    
      if ColorNum < 16 then DrawGrid1.ColCount := ColorNum else
      begin
        DrawGrid1.ColCount := 16;
        DrawGrid1.RowCount := ColorNum div 16;
      end;
      DrawGrid1.Refresh; {不刷新不行}
    
      for i := 0 to ColorNum - 1 do
      begin
        DrawGrid1.Canvas.Brush.Color := ARGBToColorRef(Colors^);
        DrawGrid1.Canvas.FillRect(DrawGrid1.CellRect(i mod 16, i div 16));
        Inc(Colors);
      end;
    
      FreeMem(Palette);
    end;
    
    end.
    
    窗体文件:
    object Form1: TForm1
      Left = 0
      Top = 0
      Caption = 'Form1'
      ClientHeight = 187
      ClientWidth = 400
      Color = clBtnFace
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'Tahoma'
      Font.Style = []
      OldCreateOrder = False
      Position = poDesktopCenter
      OnCreate = FormCreate
      OnDestroy = FormDestroy
      OnPaint = FormPaint
      PixelsPerInch = 96
      TextHeight = 13
      object DrawGrid1: TDrawGrid
        Left = 192
        Top = 8
        Width = 193
        Height = 137
        TabOrder = 0
      end
      object Button1: TButton
        Left = 8
        Top = 8
        Width = 75
        Height = 25
        Caption = 'Button1'
        TabOrder = 1
        OnClick = Button1Click
      end
      object OpenDialog1: TOpenDialog
        Left = 96
        Top = 8
      end
    end
    
  • 相关阅读:
    ~随笔A007~html中input输入框的字数限制、同步input的输入内容至div中
    ~随笔A006~微信扫码的授权、用户绑定、关注公众号、消息反馈
    【CV】实验二:特征检测与匹配
    【笔记】DLX算法及常见应用
    【笔记】和算法无关的那些东东
    【笔记】康拓展开&逆康拓展开
    【笔记】离散对数
    【笔记】Shift-And算法&Shift-OR算法
    【模板】中缀表达式求值
    【笔记】数据库系统
  • 原文地址:https://www.cnblogs.com/del/p/1235206.html
Copyright © 2011-2022 走看看