代码之家  ›  专栏  ›  技术社区  ›  treismanwolfe

如何使PNG文件以透明背景显示在Psychtoolbox中?

  •  0
  • treismanwolfe  · 技术社区  · 8 年前

    我需要在屏幕上同时显示两个图像,使用 Screen('DrawTexture') 作用一个图像是场景图像,第二个图像是对象,其中背景是透明的。我想在场景图像的顶部显示对象。然而,当我尝试这样做时,对象似乎有黑色背景。

    物体图像绝对没有问题;被召唤时 [object,map,alpha] = imread(objectimage.png) α值返回一个大小适当的矩阵。我还使用Python成功地显示了这些图像,一个在另一个之上。然而,由于各种研究原因,该项目无法用Python编写。

    我试过寻找解决方案,但我能找到的唯一解决方案与数字或图表有关,而不是 Screen 我怀疑我需要做一些阿尔法混合(可能是非常基本的),但我还没有找到任何初学者友好的指南。

    我的测试代码目前看起来像这样:

    % screen setup
    PsychDefaultSetup(2); Screen('Preference', 'SkipSyncTests', 1);
    screenNum = max(Screen('Screens')); % set screen 
    Screen('Preference','VisualDebugLevel',3);
    [w,rect] = Screen('OpenWindow',screenNum);
    % Activate for alpha
    Screen('BlendFunction', w, 'GL_SRC_ALPHA', 'GL_ONE_MINUS_SRC_ALPHA');
    
    % image presentation rectangles
    bigImSq = [0 0 500 500];
    [bigIm, xOffsetsigB, yOffsetsigB] = CenterRect(bigImSq, rect);
    smImSq = [0 0 250 250];
    [smallIm, xOffsetsigS, yOffsetsigS] = CenterRect(smImSq, rect);
    
    % IMAGES
    sceneIm = 'scene.png'; 
    objIm = 'object.png';
    sceneLoad = imread(sceneIm); 
    [objLoad,map,alpha] = imread(objIm);
    
    % final textures for display
    scene = Screen('MakeTexture',w,sceneLoad); 
    object = Screen('MakeTexture',w,objLoad); 
    
    % Image presentation
    grey = [100 100 100];
    
    Screen('FillRect',w,grey); 
    Screen('Flip',w); 
    WaitSecs(0.5);
    
    Screen('FillRect',w,grey);
    Screen('DrawTexture', w, scene,[],bigIm); % draw the scene 
    Screen('DrawTexture', w, object,[],smallIm); % draw the object 
    Screen('Flip',w); 
    WaitSecs(3);
    
    Screen('CloseAll');
    

    任何建议都将不胜感激!

    1 回复  |  直到 8 年前
        1
  •  3
  •   alexforrence    8 年前

    我认为您需要做的就是在图像中包含alpha通道 MakeTexture .

    % slightly modified boilerplate -- non-fullscreen by default,
    % and set the background color (no need for all the FillRects)
    PsychDefaultSetup(2); 
    Screen('Preference', 'SkipSyncTests', 1);
    screenNum = max(Screen('Screens')); % set screen 
    Screen('Preference', 'VisualDebugLevel', 3);
    [w, rect] = Screen('OpenWindow', screenNum, [100 100 100], [0 0 400 400]);
    
    Screen('BlendFunction', w, 'GL_SRC_ALPHA', 'GL_ONE_MINUS_SRC_ALPHA');
    
    % image presentation rectangles
    smImSq = [0 0 250 250];
    [smallIm, xOffsetsigS, yOffsetsigS] = CenterRect(smImSq, rect);
    

    这是一张透明背景的图像(为了再现性)。

    % from http://pngimg.com/upload/cat_PNG100.png
    [img, ~, alpha] = imread('cat.png');
    size(img)
    %% 2557 x 1993 x 3 (rgb)
    

    我们将制作一个不带alpha通道的纹理,一个带。

    texture1 = Screen('MakeTexture', w, img);
    img(:, :, 4) = alpha;
    texture2 = Screen('MakeTexture', w, img);
    

    首先,没有alpha通道的图像。

    Screen('DrawTexture', w, texture1, [], smallIm);
    Screen('Flip', w);
    

    然后是RGBA纹理。

    Screen('DrawTexture', w, texture2, [], smallIm);
    Screen('Flip', w);
    sca;