Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何在GPU画布上禁用插值FMX TImage或将插值设置为";“最近邻居”;_Delphi_Image Processing_Firemonkey - Fatal编程技术网

Delphi 如何在GPU画布上禁用插值FMX TImage或将插值设置为";“最近邻居”;

Delphi 如何在GPU画布上禁用插值FMX TImage或将插值设置为";“最近邻居”;,delphi,image-processing,firemonkey,Delphi,Image Processing,Firemonkey,我正在尝试创建一个“收缩到缩放”TImage函数,并希望在调整firemonkey TImage控件的大小时禁用插值(它需要跨多个设备工作) 如果“GlobalUseGPUCanvas”设置为“True”,那么将TImage的“DisableInterpolation”设置为“True”在Windows上不起作用,或者在Android上(我相信它总是使用GPU画布) 通过在项目的DPR文件中将“GlobalUseGPUCanvas”设置为“True”,并在表单的TImage上选中“Disable

我正在尝试创建一个“收缩到缩放”TImage函数,并希望在调整firemonkey TImage控件的大小时禁用插值(它需要跨多个设备工作)

如果“GlobalUseGPUCanvas”设置为“True”,那么将TImage的“DisableInterpolation”设置为“True”在Windows上不起作用,或者在Android上(我相信它总是使用GPU画布)

通过在项目的DPR文件中将“GlobalUseGPUCanvas”设置为“True”,并在表单的TImage上选中“DisableInterpolation”,Embarcadero的图像缩放样本可以轻松地再现此结果:


有没有办法真正禁用GPU画布的插值功能,或者以某种方式将GPU重采样器设置为使用最近邻算法而不是默认算法(双三次?双线性?)

您可以使用纹理直接在画布上绘制图像,而不是使用时间图像

创建纹理时,可以使用GL_NEAREST而不是GL_LINEAR(即:texture.MagFilter)指定纹理

下面是将创建纹理的delphi函数(供参考):


这难道不需要在OpenGL中重写整个UI吗?我希望有一个firemonkey GPU画布解决方案。不只是用任何Tcontrol替换timage并使用Ttexture在其上绘制…我以前没有使用Ttexture的经验,我读过关于它的文章,还有很多未知的东西。您能否给出一个示例,说明如何基于TTexture而不是示例的TImage复制Embarcadero的图像缩放示例?对于示例,您可以在的代码源中搜索TTexture。使用纹理和TTbitmap没有什么不同,要打印它,您只需执行以下操作:TCustomCanvasGpu(Canvas).DrawTexture(…);我下载了存储库的zip文件,只在“alcinoe master\archive\source\ALFmxImgList.pas”下找到了对TTexture的引用。而且似乎TTexture代码只在Android和iOS下运行,没有windows支持吗?它似乎还使用了不属于所包含代码的函数。我还从其他TBitmaps(基本上是一个基于分片的游戏)每秒生成大约100次TImage的TBitmap,添加另一个TTexture转换步骤是否会增加大量CPU开销?
class procedure TCustomContextOpenGL.DoInitializeTexture(const Texture: TTexture);
var
  Tex: GLuint;
begin
  if Valid then
  begin
    glActiveTexture(GL_TEXTURE0);
    glGenTextures(1, @Tex);
    glBindTexture(GL_TEXTURE_2D, Tex);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    case Texture.MagFilter of
      TTextureFilter.Nearest: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
      TTextureFilter.Linear: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    end;
    if TTextureStyle.MipMaps in Texture.Style then
    begin
      case Texture.MinFilter of
        TTextureFilter.Nearest: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
        TTextureFilter.Linear: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
      end;
    end
    else
    begin
      case Texture.MinFilter of
        TTextureFilter.Nearest: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
        TTextureFilter.Linear: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
      end;
    end;
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, Texture.Width, Texture.Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, nil);
    glBindTexture(GL_TEXTURE_2D, 0);
    ITextureAccess(Texture).Handle := Tex;
    if (GLHasAnyErrors()) then
      RaiseContextExceptionFmt(@SCannotCreateTexture, [ClassName]);
  end;
end;