小编Jea*_*ond的帖子

EXIF和缩略图

我正在拍摄照片查看器.在这种情况下,我写了一个小类,以便能够读取和使用一些EXIF数据,例如图像方向.这门课程适合阅读.

但是,我会添加一个新选项来旋转照片.我想旋转并写入照片数据本身,而不仅仅是重写方向标签.我已经编写了代码来旋转并保存主JPEG图像,它运行良好.但是我还需要旋转EXIF数据中包含的缩略图(如果有的话),以保持图像的连贯性.出于这个原因,我需要写入EXIF数据,以替换现有的缩略图.

但这提出了一些问题,我在回答时遇到了一些麻烦,即:

  • EXIF数据是否包含多个缩略图,如果是,图像可以包含的最大缩略图数量是多少?
  • 缩略图支持哪些格式?(我发现了JPEG和TIFF,还有其他吗?)
  • 在EXIF标准中是否有任何保证缩略图总是写在后期EXIF数据中,就在主图像之前?
  • 如果不是,则应更新包含指向要替换的缩略图之外的位置的偏移的每个标签.那么,是否有一种标准的方法来遍历所有标签和子目录,识别哪些EXIF标签包含偏移量,并在需要时更新它们?或者唯一的方法是读取最多的标签并仅重写已知的标签?
  • 或者有没有办法保证新旋转的缩略图的大小将小于或等于以前的缩略图大小?

问候

jpeg exif image

4
推荐指数
1
解决办法
2596
查看次数

内存复制和内存比较Single数组的数组

在Delphi中,我将一个3x3矩阵表声明为Single数组的数组,如下所示:

m_Table: array [0..2] of array [0..2] of Single;
Run Code Online (Sandbox Code Playgroud)

现在我想将内容与另一个表进行内存比较,或者从另一个表中复制表内容.我知道我可以创建一个嵌套循环来做到这一点,但我希望在没有任何循环的情况下完成这项工作,如果可能的话.

我的问题是,复制或比较这样的内存是正确的:

CompareMem(m_Table, other.m_Table, 9 * SizeOf(Single));
CopyMemory(m_Table, other.m_Table, 9 * SizeOf(Single));
Run Code Online (Sandbox Code Playgroud)

如果没有,这样做的正确方法是什么?

作为一个辅助问题,是否有更好的方法来获取复制长度而不是9*SizeOf(Single),例如SizeOf(m_Table ^)?

问候

memory delphi compare copy multidimensional-array

2
推荐指数
2
解决办法
217
查看次数

为什么调试器会在for-in循环中逐步执行析构函数?

在Delphi XE7(我使用RAD Studio)中,我尝试调试包内的代码.我遇到了一个我无法解释的奇怪情况.例如,我有一个类似于下面的功能(注意我知道,这个功能没有任何智能,请不要纠正它,因为我不在现实世界中使用它.它只是一个虚拟函数来说明问题我面对.)

procedure TMyClass.DemoFunc();
var
    pTest:     TObjectList<TObject>;
    pProperty: TObject;
begin
    pTest := TObjectList<TObject>.Create;

    for pProperty in pTest do
        pProperty.ToString;

    pTest.Free;
end;
Run Code Online (Sandbox Code Playgroud)

当我调试上面的代码时,我注意到调试器进入了该行

pProperty.ToString;
Run Code Online (Sandbox Code Playgroud)

如果我试着追踪上面的那一行,我会跳到

destructor TObject.Destroy;
Run Code Online (Sandbox Code Playgroud)

但是从我的观点来看,这是完全不合逻辑的,因为pTest显然是空的,所以不应该调用上面的行.

有人可以向我解释这种奇怪的行为吗?

注意我尝试调试的代码是在Delphi包中,但是该函数是从c ++项目调用的.

问候

delphi debugging for-loop empty-list

2
推荐指数
1
解决办法
171
查看次数

Delphi - 为什么不在Assign()过程中复制事件?

我观察了几个Assign()过程并注意到在分配期​​间通常会忽略事件.例如,TBitmap分配方法不会复制OnChange事件.我想知道

  1. 如果这是一种在分配期间不复制事件的普遍接受的方式,即如果所有用户都依赖于在分配期间事件永远 - 并且永远不应该 - 被复制的事实?
  2. 为什么在分配期间(至少通常)不复制事件?
  3. 或许我错了,事件可能完全被复制,只是根据具体情况而定?

问候

delphi events copy ignore assign

2
推荐指数
1
解决办法
207
查看次数

Delphi XE2-调用读取函数回调时,DFM流随机为空或已损坏

我正在创建一个程序包,其中自定义图像列表在DFM文件中读取和写入其内容。

我编写的代码在XE7和10.3 Rio之间的所有编译器中都可以很好地全局运行。但是我在XE2中有一个奇怪的问题。使用此特定的编译器,有时在读取DFM时会收到空的流内容,有时会收到损坏的内容。

我的自定义图像列表是在标准TImageList之上构建的。我以这种方式注册我的读回调:

procedure TMyImageList.DefineProperties(pFiler: TFiler);
    function DoWritePictures: Boolean;
    begin
        if (Assigned(pFiler.Ancestor)) then
            Result := not (pFiler.Ancestor is TMyImageList)
        else
            Result := Count > 0;
    end;
begin
    inherited DefineProperties(pFiler);

    // register the properties that will load and save the pictures binary data in DFM files
    pFiler.DefineBinaryProperty('Pictures', ReadPictures, WritePictures, DoWritePictures);
end;
Run Code Online (Sandbox Code Playgroud)

这是ReadPictures函数:

procedure TMyImageList.ReadPictures(pStream: TStream);
begin
    LoadPictureListFromStream(m_pPictures, pStream);
end;
Run Code Online (Sandbox Code Playgroud)

这是LoadPictureListFromStream函数:

procedure TMyImageList.LoadPictureListFromStream(pList: IWPictureList; pStream: TStream);
var
    {$if CompilerVersion <= 23}
        pImgNameBytes: Pointer;
        pData:         Pointer;
    {$else}
        imgNameBytes:  TBytes;
    {$ifend}

    count, i: …
Run Code Online (Sandbox Code Playgroud)

delphi corruption dfm delphi-xe2

1
推荐指数
1
解决办法
82
查看次数