2017-05-31 58 views
0

我有一個相當複雜的函數,我使用fsurf繪製了一個相當高的MeshDensity(我不能低於默認值,即35)。導出這個數字(saveas(gcf, 'file.pdf', 'pdf');)會產生一個非常好的質量的20多MB的pdf文件,儘管如此卻渲染得非常慢。我想減少文件大小,最重要的是,這個PDF文件的複雜性,而不是將整個圖(我的意思是整個MATLAB圖)作爲位圖導出。我怎樣才能做到這一點?在MATLAB中的矢量圖形輸出過程中,繪圖的位圖渲染部分

完美的答案將解釋如何將表面圖(我的意思是,只是白色背景上的彩色函數表面)轉換爲位圖,同時保持軸和標籤的矢量化特性。

更新:這是一個這樣的情節的例子。

enter image description here

+0

「我想在同一時間的矢量和位圖,*。*」。 Hmmmmmm。 –

+0

@AnderBiguri在我的世界裏,這被稱爲「嵌入」,對於任何曾經在pdf文件中看過照片的人來說都不是一個很大的混淆之處。 – bers

+0

PDF文件中的照片只是一個位圖,它沒有矢量圖形。顯示你的圖像,這可能是可能的,只是可能 –

回答

0

這是我的功能BitmapRender,該位圖,渲染圖中的一部分:

%% Test Code 
clc;clf; 
Objects = surf(-4-2*peaks); 
hold('on'); 
Objects(2 : 50) = plot(peaks); 
Objects(51) = imagesc([20 40], [0, 5], magic(100)); 
hold('off'); 
ylim([0 10]); 
zlim([-10 15]); 
Objects(1).Parent.GridLineStyle = 'none'; 
view(45, 45); 
set(gcf, 'Color', 'white'); 
rotate3d on 

saveas(gcf, 'pre.pdf'); 
BitmapRender(gca, Objects(2 : 3 : end)); 
% BitmapRender(gca, Objects(2 : 3 : end), [0.25 0.25 0.5 0.5], false); 
saveas(gcf, 'post.pdf'); 

函數本身是非常簡單的,除了(再)處理的知名度,如按下空格鍵(旋轉,縮放等)重新渲染圖形。

function BitmapRender(Axes, KeepObjects, RelativePosition, Draft, Key) 

if nargin < 2 
    KeepObjects = []; 
end 
if nargin < 3 
    RelativePosition = [0 0 1 1]; 
end 
if nargin < 4 
    Draft = false; 
end 
if nargin < 5 
    Key = ''; 
end 

Figure = Axes.Parent; 
FigureInnerWH = Figure.InnerPosition([3 4 3 4]); 
PixelPosition = round(RelativePosition .* FigureInnerWH); 

if isempty(Key) 
    OverlayAxes = axes(Figure, 'Units', 'Normalized', 'Position', PixelPosition ./ FigureInnerWH); 
    if Draft 
     OverlayAxes.Box = 'on'; 
     OverlayAxes.Color = 'none'; 
     OverlayAxes.XTick = []; 
     OverlayAxes.YTick = []; 
     OverlayAxes.HitTest = 'off'; 
    else 
     uistack(OverlayAxes, 'bottom'); 
     OverlayAxes.Visible = 'off'; 
    end 
    setappdata(Figure, 'BitmapRenderOriginalVisibility', get(Axes.Children, 'Visible')); 

    Axes.CLimMode = 'manual'; 
    Axes.XLimMode = 'manual'; 
    Axes.YLimMode = 'manual'; 
    Axes.ZLimMode = 'manual'; 

    hManager = uigetmodemanager(Figure); 
    [hManager.WindowListenerHandles.Enabled] = deal(false); 
    set(Figure, 'KeyPressFcn', @(f, e) BitmapRender(gca, KeepObjects, RelativePosition, Draft, e.Key)); 
elseif strcmpi(Key, 'space') 
    OverlayAxes = findobj(Figure, 'Tag', 'BitmapRenderOverlayAxes'); 
    delete(get(OverlayAxes, 'Children')); 
    OriginalVisibility = getappdata(Figure, 'BitmapRenderOriginalVisibility'); 
    [Axes.Children.Visible] = deal(OriginalVisibility{:}); 
else 
    return; 
end 

if Draft 
    return; 
end 

Axes.Visible = 'off'; 

KeepObjectsVisibility = get(KeepObjects, 'Visible'); 
[KeepObjects.Visible] = deal('off'); 

drawnow; 
Frame = getframe(Figure, PixelPosition); 

[Axes.Children.Visible] = deal('off'); 
Axes.Visible = 'on'; 
Axes.Color = 'none'; 
if numel(KeepObjects) == 1 
    KeepObjects.Visible = KeepObjectsVisibility; 
else 
    [KeepObjects.Visible] = deal(KeepObjectsVisibility{:}); 
end 

Image = imagesc(OverlayAxes, Frame.cdata); 
uistack(Image, 'bottom'); 
OverlayAxes.Tag = 'BitmapRenderOverlayAxes'; 
OverlayAxes.Visible = 'off'; 

end 

很明顯,解決方案在屏幕像素方面是像素完美的。兩個pdf文件(prepost)看起來像這樣。請注意,曲面,圖像和一些繪圖線是位圖渲染的,但其他一些繪圖線以及軸和標籤仍然是矢量化的。

enter image description here enter image description here