Эффективно устанавливать пиксели на экране - PullRequest
1 голос
/ 21 сентября 2011

Я использую WindowAPI (http://www.mathworks.com/matlabcentral/fileexchange/31437), чтобы отобразить черный полноэкранный режим в Matlab. При рисовании на экране получается, что рисование с использованием функций line () и rectangle () выполняется очень медленно.

Как я могу установить значения пикселей, не используя механизм Matlab? Например, было бы здорово получить холст окна.

1 Ответ

3 голосов
/ 23 сентября 2011

Один из способов имитировать «холст» - использовать изображение MATLAB.Идея состоит в том, чтобы вручную изменить его пиксели и обновить 'CData' построенного изображения.

Обратите внимание, что вы можете использовать изображение с теми же размерами, что и ваш размер экрана (пиксели изображения будут соответствовать пикселям экрана один-to-one), но обновление будет медленнее.Хитрость заключается в том, чтобы сохранить его небольшим и позволить MATLAB отобразить его на весь полноэкранный режим.Таким образом, изображение может иметь «жирные» пиксели.Конечно, разрешение изображения будет влиять на размер нарисованного вами маркера.

Для иллюстрации рассмотрим следующую реализацию:

function draw_buffer()
    %# paramters (image width/height and the indexed colormap)
    IMG_W = 50;    %# preferably same aspect ratio as your screen resolution
    IMG_H = 32;
    CMAP = [0 0 0 ; lines(7)];    %# first color is black background

    %# create buffer (image of super-pixels)
    %#  bigger matrix gives better resolution, but slower to update
    %#  indexed image is faster to update than truecolor
    img = ones(IMG_H,IMG_W);

    %# create fullscreen figure
    hFig = figure('Menu','none', 'Pointer','crosshair', 'DoubleBuffer','on');
    WindowAPI(hFig, 'Position','full');

    %# setup axis, and set the colormap
    hAx = axes('Color','k', 'XLim',[0 IMG_W]+0.5, 'YLim',[0 IMG_H]+0.5, ...
        'Units','normalized', 'Position',[0 0 1 1]);
    colormap(hAx, CMAP)

    %# display image (pixels are centered around xdata/ydata)
    hImg = image('XData',1:IMG_W, 'YData',1:IMG_H, ...
        'CData',img, 'CDataMapping','direct');

    %# hook-up mouse button-down event
    set(hFig, 'WindowButtonDownFcn',@mouseDown)


    function mouseDown(o,e)
        %# convert point from axes coordinates to image pixel coordinates
        p = get(hAx,'CurrentPoint');
        x = round(p(1,1)); y = round(p(1,2));

        %# random index in colormap
        clr = randi([2 size(CMAP,1)]);  %# skip first color (black)

        %# mark point inside buffer with specified color
        img(y,x) = clr;

        %# update image
        set(hImg, 'CData',img)
        drawnow
    end
end

screenshot

...