2017-05-31 57 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