访问类的私有变量的两种方式
来源:互联网 发布:社交媒体数据 作用 编辑:程序博客网 时间:2024/05/18 09:18
在用image加载bmp图片时,要使用某点的像素值,传统的做法是scanline、canvas.pixel、或者用api函数来获取。
既然image能画出bmp图片来,bmp中应该包含这个位图的像素值。来找找。果然找到了
TBitmap 的 父类是 TGraphic,
TBitmap = class(TGraphic) private FImage: TBitmapImage; FCanvas: TCanvas; FIgnorePalette: Boolean; FMaskBitsValid: Boolean; FMaskValid: Boolean; FTransparentColor: TColor; FTransparentMode: TTransparentMode; FAlphaFormat: TAlphaFormat; procedure Changing(Sender: TObject); procedure CopyImage(AHandle: HBITMAP; APalette: HPALETTE; DIB: TDIBSection); procedure DIBNeeded; procedure FreeContext; function GetCanvas: TCanvas;
TGraphic的第一个私有变量就是FImage, FImage: TBitmapImage;
查看 TBitmapImage
TBitmapImage = class(TSharedImage) private FHandle: HBITMAP; // DDB or DIB handle, used for drawing FMaskHandle: HBITMAP; // DDB handle FPalette: HPALETTE; FDIBHandle: HBITMAP; // DIB handle corresponding to TDIBSection FDIB: TDIBSection; FSaveStream: TMemoryStream; // Save original RLE stream until image is modified FHalftone: Boolean; // FPalette is halftone; don't write to file{$IF DEFINED(CLR)} FImageFormat: TImageFormat;{$ELSE} FOS2Format: Boolean; // Write BMP file header, color table in OS/2 format{$IFEND} protected procedure FreeHandle; override; public destructor Destroy; override;{$IF DEFINED(CLR)} function GetHashCode: Integer; override;{$IFEND} end;
FDIB: TDIBSection;就是我需要的。
type PDIBSection = ^TDIBSection; {$EXTERNALSYM tagDIBSECTION} tagDIBSECTION = packed record dsBm: TBitmap; dsBmih: TBitmapInfoHeader; dsBitfields: array[0..2] of DWORD; dshSection: THandle; dsOffset: DWORD; end; TDIBSection = tagDIBSECTION; {$EXTERNALSYM DIBSECTION} DIBSECTION = tagDIBSECTION;
dsBm: TBitmap; 包含像素值。查看TBitmap。
PBitmap = ^TBitmap; {$EXTERNALSYM tagBITMAP} tagBITMAP = packed record bmType: Longint; bmWidth: Longint; bmHeight: Longint; bmWidthBytes: Longint; bmPlanes: Word; bmBitsPixel: Word; bmBits: Pointer; end; TBitmap = tagBITMAP; {$EXTERNALSYM BITMAP} BITMAP = tagBITMAP;
bmBits: Pointer;中包含的就是位图的像素值了。
如何获取这个值呢?
这就涉及到如何获取类的私有变量的问题
第一步:获取FImage ,获取类的私有变量方法一
TBitmap 的 IgnorePalette 属性是公开的,我们可以访问到。FIgnorePalette = IgnorePalette,说明我们可以通过 IgnorePalette 找到 FIgnorePalette 的地址,在上两个
就是 FImage的地址了。
FImage := Pointer(@srcbmp.IgnorePalette); dec(FImage, SizeOf(TCanvas) - 2);
第二步:获取 FDIB,获取类的私有变量方法二
TBitmapImage 类没有任何导出函数,方法一派不上用场了。
直接用地址。
FImage^ 里面存放了 TBitmapImage 类的内存起始地址
FImage^ + 4 * 4 + 8 就是 FDIB的地址了
FDIB := Pointer(FImage^ + 24);
GOOD,可以任意访问私有变量了。
1 0
- 访问类的私有变量的两种方式
- 访问操作类私有属性和方法的两种方式
- js 函数内部私有变量的 访问方式
- iOS访问类的私有成员变量及私有方法
- iOS访问类的私有成员变量及私有方法
- 访问私有变量的疑问
- 拷贝函数访问本类的私有变量的问题
- 类的私有变量
- 类的私有变量
- 访问C++类对象中私有成员变量的方法
- C++访问类中私有成员变量的方法
- 为何能访问内部静态类的私有静态变量?
- 关于Java子类访问父类的私有变量
- 用灵活的指针访问类私有变量
- java内部类----安全问题-----访问外围类的私有变量
- java访问类的私有变量和方法
- 访问私有变量疑问的解决
- <C++>私有变量的访问权限
- JS中的浮升和捕获
- strcpy和memcpy的区别
- StackOverflowError出现的原因及解决办法
- Linux内核Socket CAN中文文档
- 最小的k个数
- 访问类的私有变量的两种方式
- java总结之克隆
- 第六周阅读程序五
- 华为CE12800接口默认配置
- 气象数据获取
- CheckBox点击lable文字选中
- 下载JDK历史版本,遇到url无法获取。
- fdisk扩容原分区容量大小
- 毕福剑风波