Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.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
在Matlab中从面片对象创建位图_Matlab_Bitmap_Matlab Figure - Fatal编程技术网

在Matlab中从面片对象创建位图

在Matlab中从面片对象创建位图,matlab,bitmap,matlab-figure,Matlab,Bitmap,Matlab Figure,我在X,Y矩阵中有一组多边形顶点,它们的颜色在另一个矩阵C的RGB值中 然后,我使用fill()函数生成显示在Matlab图形中的面片对象 我想从这个图中创建一个bmp对象。我所说的bmp对象是指像素的x,y坐标和RGB值 如果我使用print()函数,使用'-dbmp'和文件名,matlab可以将bmp写入文件。但是我必须用imread()读取文件来创建bmp对象 有没有一种方法可以在不写入和读取文件的情况下创建bmp对象 因为我必须多次执行此操作,写入和读取文件非常耗时,我想这也会缩短磁盘的

我在X,Y矩阵中有一组多边形顶点,它们的颜色在另一个矩阵C的RGB值中

然后,我使用fill()函数生成显示在Matlab图形中的面片对象

我想从这个图中创建一个bmp对象。我所说的bmp对象是指像素的x,y坐标和RGB值

如果我使用print()函数,使用'-dbmp'和文件名,matlab可以将bmp写入文件。但是我必须用imread()读取文件来创建bmp对象

有没有一种方法可以在不写入和读取文件的情况下创建bmp对象

因为我必须多次执行此操作,写入和读取文件非常耗时,我想这也会缩短磁盘的使用寿命

编辑:根据答案编辑后的代码

N = 5;
Tri = 100;
res = 200; %200 pixles per inch
G = zeros(Tri,9,N);


X = 2*rand(Tri,3,N);
Y = 2*rand(Tri,3,N);
R = randi([0 255],Tri,N)/255;
G = randi([0 255],Tri,N)/255;
B = randi([0 255],Tri,N)/255;

for c1=1:N
   G(:,1:3,c1)= X(:,:,c1);
    G(:,4:6,c1)= Y(:,:,c1);
    G(:,7,c1)= R(:,c1);
    G(:,8,c1)= G(:,c1);
    G(:,9,c1)= B(:,c1);

end

for c2=1:N;
    h = figure('Visible','off');
    set(h, 'PaperUnits', 'inches', 'PaperPosition', [0 0 400 400]/res);
    for c3 =1:Tri
        h1 = fill(G(c3,1:3,c2), G(c3,4:6,c2), [G(c3,7,c2) G(c3,8,c2) G(c3,9,c2)]);
        set(h1,'EdgeColor','None');
        hold on;
    end
    %print(h,'-dbmp',['-r' num2str(res)],['file' num2str(c2)]);
    F = getframe(h);
    [a, b] = frame2im(F);

    Tmp_v1 =  a;
    Tmp_v1 = Tmp_v1(:);
    Norm_v1(c2) = norm(single(Tmp_v1));
end

谢谢。

如果您打开了当前图形,您可以试试这个成语。一旦您访问了这个,您就可以通过查看结构中的
cdata
字段来访问帧的图像数据。完成后,您可以使用MATLAB的图像处理工具箱中的命令(希望您拥有它…)将图像写入文件

下面是一个例子:

x = 1 : 5;
y = 1 : 5;
plot(x,y); %// Plot a line
h = getframe;
img = h.cdata;
imwrite(img, 'testFrame.bmp');
这应该能够获取当前图形中的内容并将其保存到文件中。在这种情况下,这将是一条从
(x,y)=(1,1)
(x,y)=(5,5)
的直线,斜率为1。请记住,这不会保存图形或轴的标题。这将仅获取帧内渲染的内容


根据评论编辑 现在我知道你真正想要的是什么,你想要生成一堆随机多边形,然后只提取核心图像,没有任何轴或记号等等。您必须在创建图像的地方修改
for
循环,以便让图形填充整个窗口而不使用任何灰色填充。您还需要关闭轴。另外,在生成每个图像时,需要关闭刻度。这是通过不写入任何记号标签以及将记号长度设置为0来完成的。换句话说,您需要修改代码,使其看起来像这样。通过查看代码中的
%//NEW
语句,您将看到我在何处插入了代码:

for c2=1:N;
    h = figure('Visible','off');
    subplot('position', [0 0 1 1]); %// NEW
    axis off; %// NEW
    set(h, 'PaperUnits', 'inches', 'PaperPosition', [0 0 400 400]/res);
    for c3 =1:Tri
        h1 = fill(G(c3,1:3,c2), G(c3,4:6,c2), [G(c3,7,c2) G(c3,8,c2) G(c3,9,c2)]);
        set(h1,'EdgeColor','None');
        set(gca,'xcolor','w','ycolor','w','xtick',[],'ytick',[]) %// NEW
        set(gca,'Ticklength',[0 0]); %// NEW
        hold on;
    end
    %print(h,'-dbmp',['-r' num2str(res)],['file' num2str(c2)]);

    F = getframe(h);
    close all; %// NEW
    [a, b] = frame2im(F);
    a = imresize(a, [400 400], 'nearest'); %// NEW

    Tmp_v1 =  a;
    Tmp_v1 = Tmp_v1(:);
    Norm_v1(c2) = norm(single(Tmp_v1));
end

这仍然会为您创建的每个图像显示弹出的帧,但此时您应该能够获得纯图像数据。请注意,这些图像仍然显示为略大于
400 x 400
。这是因为,一旦我们删除了边框和记号等,图形将拉伸以填充整个图形。为了解决这个问题,我使用图像并根据您所需的大小将其缩小到
400 x 400


另外,请注意,每次生成新图像时,都会生成一个新的图形。每次调用
getframe
,都会弹出带有此随机生成的多边形图像的图形,
getframe
会拍摄当前帧的快照。没有办法防止这种情况发生,因为您将无法拍摄该图形的快照。解决此问题的一种方法是在抓取图像后关闭该图形。您可以执行
全部关闭getframe
后,都会调用code>。这样,一次只能显示一个图形,但这仍然不会阻止图形显示


如果我真的找到了解决办法,我会让你知道的

谢谢,成功了。但有一个小问题。我的图像设置为400 x 400像素,但cdata有更多像素。我猜这一定是图形周围的框架和轴。我可以删除它们吗?我在编辑问题时包含了getframe()的代码。@user3761729-让我看看。我会给你回复的我试着选择中心400×400像素,看看这是否代表了我的身材,但实际上它在x轴上切割得更多,y轴上还有一些灰色区域。所以我猜除了添加灰色区域之外,getframe()中还发生了一些失真。并且getframe()甚至用分号将图形输出到屏幕。我也不想这么说,谢谢
getframe
拍摄了当前屏幕的快照,图的中心就是这个屏幕。我唯一能建议的是使用
getframe
,但是您也可以指定一个矩形,表示希望在哪里拍摄快照。我建议将图移到左上角,然后手动确定核心窗口的位置。我再打给你,谢谢。我试试看。另外,我想我告诉你我的方法而不是问题,可能影响了你的判断。我的问题是,我有一组由3个x、y点和rgb颜色定义的三角形,我想从这些三角形中创建一个位图(400×400像素),所有这些三角形都放在一起。