如圖這種心形的標籤雲如何生成?

看起來有點像工具生成的,因為手工PS做貌似太麻煩了。

我比較喜歡代碼方案,嘿嘿嘿……


用的是比較笨的方法,檢查隨機的生成字元可以放入的位置,之後隨機放置。按照相同的方法可以生成對應不同圖形不同文本的類似圖片

% h: 遮罩高 w: 遮罩寬 n: 字元串個數上限
% 如果系統設置過dpi縮放結果可能會有問題,所以建議在不縮放的情況下實驗
h = 500; w = 500; n = 120;
str = "王翊韜"; fontName = "Dengxian"; fontSize = [7 70];
% 生成心形遮罩
[x,y] = meshgrid(linspace(-1.2,1.2,500),linspace(-1,1.3,500));
A = flipud((x.^2+y.^2-1).^3-x.^2.*y.^3&<0); % 生成不同字體大小的字元個數 fs = -sort(log(rand(1,n))); fs = max(fs/max(fs)*fontSize(2),fontSize(1)); % 繪製遮罩 figure("color","k","defaultAxesUnit","pixel","pos",[100 100 2*w h]); him = imshow(A); ax = gca; set(ax,"pos",[0 0 2*w h],"visible","off","xlim",[0 2*w]+.5); % tr隨機生成的文字樣本 ht = handle(text(3*w/2,h/2,str,"FontName",fontName,"Background","w","color","w",... "HorizontalAlignment","center","VerticalAlignment","middle","Margin",eps)); for i = 1:n % 截取隨機生成的字元圖片a: 01矩陣 set(ht,"Rotation",180*rand-90,"FontSize",fs(i)) B = 0~=getfield(getframe(ax,ht.Extent+[0 -ht.Extent(4) 0 0]),"cdata",{":",":",1}); % 獲取可以填充字元的位置 [y,x] = find(convn(A,rot90(B,2),"valid")==nnz(B)); if x % 如果存在至少一個位置,隨去選取一個放入結果並且根據結果重新生成遮罩 k = randi(numel(x)); set(copy(ht,ax),"pos",[x(k) y(k)]+flip(size(B))/2,"back","n","color","k") A = getfield(getframe(ax,[0 0 w h]),"cdata",{":",":",1}) == 255; end end % 設定文本顏色並輸出圖片 set(gcf,"PaperPositionMode","auto","pos",[100 100 w h]); delete(him), set(ax,"xlim",[0 w]+.5,"pos",[0 0 w h]) ht = findobj(ax,"type","text"); set(ht,{"color"},num2cell(winter(numel(ht)),2)) print -r150 -dpng output.png


你發的圖片上已經有答案了啊:http://tagxedo.com


看著有多不爽(?_?)為什麼反對


圖片上就是網址,在線詞雲生成工具。但是要翻牆


圖是 wordcloud/tagcloud/wordle, 常見的可視化圖表之一(不過通常的圖沒有外形限制),wordle作者寫的一篇文章可以參考http://static.mrfeinberg.com/bv_ch03.pdf,有在線工具,也有開源代碼。具體演算法算是有點複雜,不是我所擅長的。


推薦閱讀:

為什麼CMYK的色彩範圍會比RGB的小?
PS 如何自然地給LOGO換背景純色圖?
這種風格的圖紙是怎樣製作出來的?
如何製作類似合金彈頭風格的像素圖?
這種設計是怎麼做出來的?

TAG:AdobePhotoshop | 前端開發 | 程序員 | MATLAB | 標籤雲 |