基于Java的不固定長度字符集在指定寬度和自適應模型下圖片繪制生成實戰

目錄

前言

一、需求介紹

1、指定寬度生成

2、指定列自適應生成

二、Java生成實現

1、公共方法

2、指定寬度生成

3、指定列自適應生成

三、總結


前言

????????在當今數字化與信息化飛速發展的時代,圖像的生成與處理技術正日益成為眾多領域關注的焦點。從創意設計到數據可視化,從游戲開發到人工智能輔助創作,高效、精準且具有高度適應性的圖像生成方案有著廣泛而迫切的需求。Java 作為一種強大、穩定且廣泛應用的編程語言,在圖像繪制領域也發揮著不可忽視的作用。

? ? ? ? 在GIS領域,比如圖例的生成就會面對以上的問題。由于在進行字符標注時無法預測文本的長度,因此我們需要能有一種自適應文本長度的生成方法,但是同時,也有可能我們需要指定一種寬度從而對字符文本進行繪制的需要。如下兩圖所示:

自適應寬度生成示意圖

指定寬度生成示意圖?

????????本實戰旨在深入探討基于 Java 的不固定長度字符集在指定寬度和自適應模型下圖片繪制生成的方法與技巧。不固定長度字符集為圖片繪制帶來了獨特的挑戰與機遇。一方面,其靈活多變的字符組合方式能夠創造出豐富多樣、極具個性化的圖像效果,為創意表達提供了廣闊空間;另一方面,如何在保證圖像整體協調性與美觀性的前提下,合理安排不同長度字符在指定寬度內的布局,實現自適應模型下的高效繪制,需要深入研究與實踐。

????????通過本次實戰,我們期望為讀者提供一套完整、實用且具有創新性的基于 Java 的圖片繪制解決方案,幫助讀者提升在圖像生成領域的技術能力,激發他們在數字創作方面的靈感與潛力,從而在各自的應用場景中創造出更具價值與吸引力的圖像作品,為推動圖像技術的發展與應用貢獻一份力量。

一、需求介紹

????????在面向地理空間的圖例生成過程,我們通常會遇到以下兩種情況:第一種是需要指定寬度,比如要求在寬度為200px的圖片中,將指定的文字在圖片中生成。第二種就是需要根據指定列,即一行展示幾列,然后自適應的生成固定寬度的圖片。本節將主要介紹這兩個需求。這里我們需要展示的是一些不一定長的字符串集合,模擬展示以下這些地名數據,如下所示:

String[] demoTexts = {" 項目管理", "軟件開發", "數據分析","人工智能", "云計算", "網絡安全","用戶體驗", "測試驗證", "運維部署", "昆明市","曲靖市","玉溪市","保山市","昭通市","麗江市","普洱市","臨滄市","楚雄彝族自治州","紅河哈尼族彝族自治州","文山壯族苗族自治州","西雙版納傣族自治州","湘西土家族苗族自治州","深圳市","保亭黎族苗族自治縣","阿壩藏族羌族自治州","黔西南布依族苗族自治州","克孜勒蘇柯爾克孜自治州","雙江拉祜族佤族布朗族傣族自治縣","積石山保安族東鄉族撒拉族自治縣","中國石油集團東方地球物理勘探有限責任公司霸州基地管理處居委會","天津市薊州區京津州河科技產業園管理委員會虛擬社區","窯街煤電集團民勤縣瑞霖生態農林有限責任公司生活區","沈陽市于洪區紅旗土地股份合作經營有限公司生活區","大理白族自治州","德宏傣族景頗族自治州","怒江傈僳族自治州","迪慶藏族自治州"
};

1、指定寬度生成

????????指定寬度生成,即我們對目標成果的圖片寬度是有要求的,比如寬度指定為200px。核心需求如下:

????????固定總寬度模式

  • 平均分配列寬:根據總寬度和列數計算每列可用寬度

  • 自動換行:根據列數自動計算行數

  • 文本截斷:超長文本添加省略號

2、指定列自適應生成

????????自適應列寬模式

  • 動態計算列寬:根據每列中最長的條目確定列寬,遍歷所有文本,計算每個條目(矩形+間距+文本)的總寬度,確定最大寬度作為圖像寬度。

  • 計算高度:基于行數和字體高度計算總高度

  • 自動換行:根據列數自動計算行數

  • 保持完整顯示:不截斷文本

二、Java生成實現

????????本小節將根據上面的生成需求來具體講解如何進行詳細的生成。java生成的實現分成三個部分,第一部分是介紹兩個公共方法,第二部分介紹如何按照指定寬度生成,第三部分介紹如何進行自適應生成,通過代碼實例的方法進行講解。

1、公共方法

????????為了方便對對繪制的文字展示得更加美觀,這里我們每進行一次繪制就修改畫筆的顏色。因此需要一個生成指定顏色的方法,在java中生成Color對象,并且轉為十六進制的顏色表示,核心方法如下:

/**
* - 將color轉十六進制字符串
* @param color
* @return
*/
public static String Color2String(Color color) {// 獲取 RGB 顏色值,格式為 0x00RRGGBBint rgb = color.getRGB();// 將 RGB 轉換為十六進制字符串,去掉前兩位的透明度部分(如果是純不透明顏色)String hexColor = "#" + Integer.toHexString(rgb & 0xffffff);return hexColor;
}

????????根據不同字符串生成均勻分布的顏色方法如下:

// 生成可區分顏色(HSV色環均勻分布)
private static Color[] generateDistinctColors(int count) {Color[] colors = new Color[count];float goldenRatio = 0.618033988749895f;  // 黃金分割比例float saturation = 0.8f;  // 飽和度float brightness = 0.9f;  // 亮度for (int i = 0; i < count; i++) {float hue = (i * goldenRatio) % 1.0f;colors[i] = Color.getHSBColor(hue, saturation, brightness);}return colors;
}

?????????以上兩個方法在指定寬度生成和自適應生成中均會使用到,因此在此簡單列出來。

2、指定寬度生成

按指定寬度生成的核心方法如下:

// 固定總寬度模式
public static BufferedImage createFixedColumnsImage(String[] texts, int columns,int totalWidth, Font font,int padding, int columnSpacing,int rowSpacing) {BufferedImage tempImg = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);Graphics2D tempG = tempImg.createGraphics();tempG.setFont(font);FontMetrics fm = tempG.getFontMetrics();final int RECT_SIZE = 10;final int ENTRY_SPACING = 5;// 生成顏色序列Color[] colors = generateDistinctColors(texts.length);// 計算列寬int availableWidth = totalWidth - padding * 2 - (columns - 1) * columnSpacing;int columnWidth = availableWidth / columns;int textMaxWidth = columnWidth - RECT_SIZE - ENTRY_SPACING;// 處理文本List<String> processedTexts = new ArrayList<>();for (String text : texts) {processedTexts.add(truncateText(text, textMaxWidth, fm));}// 計算總高度int rows = (int) Math.ceil((double)texts.length / columns);int totalHeight = padding * 2 + rows * (fm.getHeight() + rowSpacing) - rowSpacing;// 創建圖像BufferedImage image = new BufferedImage(totalWidth, totalHeight, BufferedImage.TYPE_INT_ARGB);Graphics2D g = image.createGraphics();setupGraphics(g, font);// 繪制背景g.setColor(Color.WHITE);g.fillRect(0, 0, totalWidth, totalHeight);// 繪制條目int yBase = padding + fm.getAscent();int[] columnX = new int[columns];for (int i = 0; i < columns; i++) {columnX[i] = padding + i * (columnWidth + columnSpacing);}for (int i = 0; i < processedTexts.size(); i++) {g.setColor(colors[i]);int col = i % columns;int row = i / columns;int y = yBase + row * (fm.getHeight() + rowSpacing);int rectY = y - fm.getAscent() + (fm.getHeight() - RECT_SIZE)/2;// 繪制矩形g.fillRect(columnX[col], rectY, RECT_SIZE, RECT_SIZE);// 繪制文本g.drawString(processedTexts.get(i), columnX[col] + RECT_SIZE + ENTRY_SPACING, y);}g.dispose();tempG.dispose();return image;
}

????????由于在指定寬度的生成方式中,繪制的圖片寬度是固定的,而文字的字數是不固定的。因此在繪制的過程中,需要對超長的文本進行截取,超長的部分將使用省略號來進行展示。對超長文本字符進行截斷處理的方法如下:

private static String truncateText(String text, int maxWidth, FontMetrics fm) {if (fm.stringWidth(text) <= maxWidth) return text;int ellipsisWidth = fm.stringWidth("...");int availableWidth = maxWidth - ellipsisWidth;int length = text.length();while (length > 0 && fm.stringWidth(text.substring(0, length)) > availableWidth) {length--;}return length > 0 ? text.substring(0, length) + "..." : "";
}

?????????生成指定寬度的圖片調用方法如下:

// 生成固定寬度圖片(400px寬,2列)
BufferedImage fixedImage = createFixedColumnsImage(demoTexts, 2, 400,new Font("宋體", Font.PLAIN, 12),15, 20, 10
);
ImageIO.write(fixedImage, "PNG", new File("D:/fixed_columns_250420.png"));

????????生成的成果圖片如下:

3、指定列自適應生成

????????生成指定列的自適應圖片生成的核心方法如下:

// 自適應列寬模式public static BufferedImage createAdaptiveColumnsImage(String[] texts, int columns,Font font, int padding, int columnSpacing, int rowSpacing) {BufferedImage tempImg = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);Graphics2D tempG = tempImg.createGraphics();tempG.setFont(font);FontMetrics fm = tempG.getFontMetrics();final int RECT_SIZE = 10;final int ENTRY_SPACING = 5; // 圖標與文字間距// 生成顏色序列Color[] colors = generateDistinctColors(texts.length);int index = 0;for (String text : texts) {texts[index] = Color2String(colors[index]) + " " + text; //processedTexts.add(truncateText(text, textMaxWidth, fm));index ++;}// 計算列寬int[] columnWidths = new int[columns];for (int i = 0; i < texts.length; i++) {int col = i % columns;int width = RECT_SIZE + ENTRY_SPACING + fm.stringWidth(texts[i]);if (width > columnWidths[col]) {columnWidths[col] = width;}}// 計算總尺寸int totalWidth = padding * 2;for (int w : columnWidths) {totalWidth += w + columnSpacing;}totalWidth -= columnSpacing; // 最后一列不加間距int rows = (int) Math.ceil((double)texts.length / columns);int totalHeight = padding * 2 + rows * (fm.getHeight() + rowSpacing) - rowSpacing;// 創建圖像BufferedImage image = new BufferedImage(totalWidth, totalHeight, BufferedImage.TYPE_INT_ARGB);Graphics2D g = image.createGraphics();setupGraphics(g, font);// 繪制背景g.setColor(Color.WHITE);g.fillRect(0, 0, totalWidth, totalHeight);// 繪制條目int x = padding;int yBase = padding + fm.getAscent();int[] columnX = new int[columns];for (int i = 0; i < columns; i++) {columnX[i] = x;x += columnWidths[i] + columnSpacing;}g.setColor(Color.RED);for (int i = 0; i < texts.length; i++) {g.setColor(colors[i]);int col = i % columns;int row = i / columns;int y = yBase + row * (fm.getHeight() + rowSpacing);int rectY = y - fm.getAscent() + (fm.getHeight() - RECT_SIZE)/2;// 繪制矩形g.fillRect(columnX[col], rectY, RECT_SIZE, RECT_SIZE);// 繪制文本g.drawString(texts[i], columnX[col] + RECT_SIZE + ENTRY_SPACING, y);}g.dispose();tempG.dispose();return image;}

????????在自適應生成的過程中,最需要處理的邏輯就是動態的計算寬度等值。最終生成的結果圖片如下:

三、總結

????????以上就是本文的主要內容,本實戰旨在深入探討基于 Java 的不固定長度字符集在指定寬度和自適應模型下圖片繪制生成的方法與技巧。不固定長度字符集為圖片繪制帶來了獨特的挑戰與機遇。一方面,其靈活多變的字符組合方式能夠創造出豐富多樣、極具個性化的圖像效果,為創意表達提供了廣闊空間;另一方面,如何在保證圖像整體協調性與美觀性的前提下,合理安排不同長度字符在指定寬度內的布局,實現自適應模型下的高效繪制,需要深入研究與實踐。

????????通過本次實戰,我們期望為讀者提供一套完整、實用且具有創新性的基于 Java 的圖片繪制解決方案,幫助讀者提升在圖像生成領域的技術能力,激發他們在數字創作方面的靈感與潛力,從而在各自的應用場景中創造出更具價值與吸引力的圖像作品,為推動圖像技術的發展與應用貢獻一份力量。行文倉促,定有不足之處,歡迎各位朋友在評論區批評指正,不勝感激。

????????完整的代碼鏈接如下:Java根據字符串集合生成固定寬度和自適應寬度源碼。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/85401.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/85401.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/85401.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

軟考 系統架構設計師系列知識點之雜項集萃(93)

接前一篇文章&#xff1a;軟考 系統架構設計師系列知識點之雜項集萃&#xff08;92&#xff09; 第169題 人工智能技術已成為當前國際科技競爭的核心技術之一&#xff0c;AI芯片是占據人工智能市場的法寶。AI芯片有別于通常處理器芯片&#xff0c;它應具備四種關鍵特征。&…

Kotlin實現文件下載斷點續傳(RandomAccessFile全解析)

本文將深入探討如何使用Kotlin和RandomAccessFile實現高效的斷點續傳功能&#xff0c;涵蓋原理分析、完整代碼實現、性能優化及工程實踐要點。 一、斷點續傳核心原理 1.1 HTTP斷點續傳協議 #mermaid-svg-EfmgPUx3SFkso8Fc {font-family:"trebuchet ms",verdana,aria…

linux-headers-$(uname -r)和kmod是什么?

2025年6月16日&#xff0c;周一清晨 Linux-headers-$(uname -r)與kmod包詳解 一、linux-headers-$(uname -r)包 linux-headers-(uname -r)是Linux系統中與當前運行內核版本匹配的內核頭文件包&#xff0c;其中(uname -r)會自動替換為當前內核版本號&#xff08;如5.13.0-19-g…

使用axios及和spirng boot 交互

Axios Axios是一個基于Promise的HTTP庫&#xff0c;可以發送get、post等請求&#xff0c;它作用于瀏覽器和Node.js中。當運行在瀏覽器時&#xff0c;使用XMLHttpRequest接口發送請求&#xff1b;當運行在Node.js時&#xff0c;使用HTTP對象發送請求。 使用步驟&#xff1a; 第…

布局文件的逐行詳細解讀

總覽 源碼 <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto&…

VTK 顯示大量點云數據及交互(點云拾取、著色、測量等)功能

VTK (Visualization Toolkit) 是一個強大的開源可視化庫&#xff0c;非常適合處理點云數據。下面將介紹如何使用 VTK 顯示大量點云數據&#xff0c;并實現點云拾取、著色、測量等功能。 基本點云顯示 創建一個基本的點云顯示程序&#xff1a; cpp #include <vtkSmartPoi…

性能優化 - 高級進階: 性能優化全方位總結

文章目錄 Pre1. 概述&#xff1a;性能優化提綱與使用場景2. 準備階段2.1 明確優化范圍與目標2.2 環境與工具準備 3. 數據收集與指標確認3.1 關鍵資源維度與指標項3.2 監控體系搭建與初始采集3.3 日志與追蹤配置 4. 問題定位思路4.1 從整體到局部的分析流程4.2 常見瓶頸維度檢查…

Mybatis之Integer類型字段為0,入庫為null

背景&#xff1a; 由于項目某個功能用到優先級字段來判斷&#xff0c;需要在mysql表中定義一個字段XX&#xff0c;類型為int&#xff0c;默認為0&#xff0c;具體值由后臺配置&#xff0c;正常入庫即可 問題&#xff1a; 由于后臺配置存量其他類型的數據無需該字段&#xff0c…

上海市計算機學會競賽平臺2022年3月月賽丙組洗牌

題目描述 給定一個整數 nn&#xff0c;表示 nn 張牌&#xff0c;牌的編號為 11 到 nn。 再給定一個洗牌置換 f1,f2,…,fnf1?,f2?,…,fn?&#xff0c;進行一次洗牌操作時&#xff0c;應將第一號位置的牌交換到第 f1f1? 號位置&#xff0c;將第 ii 號位置的牌交換到第 fifi…

DINO-R1:激勵推理能力的視覺基礎模型

摘要 近期&#xff0c;人們對大型語言模型&#xff08;如DeepSeek-R1&#xff09;推理能力的關注呈爆炸式增長&#xff0c;通過基于強化學習的微調框架&#xff08;如組相對策略優化&#xff08;Group Relative Policy Optimization&#xff0c;GRPO&#xff09;方法&#xff…

Linux--LVM邏輯卷擴容

Linux–LVM邏輯卷擴容 文章目錄 Linux--LVM邏輯卷擴容?? LVM 常用命令分類及基本格式? 1. 物理卷(PV)相關命令? 2. 卷組(VG)相關命令? 3. 邏輯卷(LV)相關命令?? 三、查看類命令簡寫說明使用命令及基本格式:lvm邏輯卷擴容步驟:1.添加硬盤設備2.檢測新增硬盤 添加…

C#基礎語法與控制臺操作

1. 控制臺操作基礎 控制臺程序是學習C#的起點。以下是一些常用的控制臺操作方法&#xff1a; 1.1. 清除控制臺 Console.Clear(); // 清除控制臺內容1.2. 輸出字符串 Console.WriteLine("Hello World!"); // 在屏幕的當前位置換行輸出字符串 Console.Write("…

100.Complex[]同時儲存實數和虛數兩組double的數組 C#例子

在信號處理中&#xff0c;IQ 數據&#xff08;In-phase and Quadrature&#xff09;通常表示復數形式的信號&#xff0c;其中實部表示同相分量&#xff0c;虛部表示正交分量。Complex[] data 是一個包含 IQ 數據的數組&#xff0c;每個元素是一個復數&#xff0c;表示一個信號樣…

停止追逐 React 重渲染

大多數開發者都在浪費時間對抗多余的重渲染。真正的 React 架構師根本讓問題無從產生——下面就來揭開他們的思路&#xff0c;以及為何大多數所謂的性能優化技巧反而拖慢了你的應用。 重渲染的無盡輪回 先來直擊痛點&#xff1a;如果還在項目里到處撒 useMemo、useCallback&…

流水線的安全與合規 - 構建可信的交付鏈

流水線的安全與合規 - 構建可信的交付鏈 “安全左移 (Shift-Left Security)”的理念 “安全左移”是 DevSecOps 的核心理念,指的是將安全測試和考量,從軟件開發生命周期 (SDLC) 的末端(發布前),盡可能地向左移動到更早的階段(如編碼、構建、測試階段)。 為何對 SRE 至…

???????神經網絡基礎講解 一

??一.神經網絡 ? ??1. 全連接神經網絡&#xff08;Fully Connected Network, FCN&#xff09;?? ??核心概念&#xff1a;?? ??輸入層??&#xff1a;接收原始數據&#xff08;如數字、圖片像素等&#xff09; 數字矩陣 。??隱藏層??&#xff1a;對數據…

MySQL 8.0 OCP 英文題庫解析(二十二)

Oracle 為慶祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免費考取原價245美元的MySQL OCP 認證。 從今天開始&#xff0c;將英文題庫免費公布出來&#xff0c;并進行解析&#xff0c;幫助大家在一個月之內輕松通過OCP認證。 本期公布試題201~210 試題2…

【大模型推理】PD分離場景下decoder負載均衡,如何選取decoder

https://mp.weixin.qq.com/s?__bizMzg4NTczNzg2OA&mid2247507420&idx1&sn4b32726abd205c7f94144bcb9105330f&chksmce64b9fc7f1d8de04a40b0153302dee52262c6f104c67195e2586e75c8093b8be493f252c8a3#rd 在非 Local 場景下&#xff0c;Prefill 定時獲取 Decode …

【IP地址】IP應用場景的使用方向

網絡安全領域 通過IP地址查詢&#xff0c;安全系統能夠實時監控網絡流量&#xff0c;識別異常訪問行為。例如&#xff0c;當某個IP地址在短時間內頻繁發起大量請求&#xff0c;且訪問模式與正常用戶存在明顯差異時&#xff0c;系統可將其標記為可疑IP&#xff0c;觸發風險預警…

3-18 WPS JS宏 顏色設置實例應用(按條件設置單元格顏色)學習筆記

前面講解了關于單元格的一些格式的設置&#xff0c;本節課再講解一下各種清除方法。 1.函數解析與用法 Range().clear()//清除全部 Range().Value2null //清除內容 Range().ClearContents()//清除內容 Range().ClearFormats()//清除格式 Range().EntireRow.Range()//以Ra…