मैं स्ट्रिंग की ऊंचाई प्राप्त करने के लिए FontMetrics.getHeight()
का उपयोग कर रहा हूं, लेकिन यह मुझे स्ट्रिंग वर्णों के वंशजों को काटकर गलत मान देता है। क्या कोई बेहतर काम है जिसका मैं उपयोग कर सकता हूं?जावा में असली स्ट्रिंग ऊंचाई कैसे प्राप्त करें?
उत्तर
नीचे getStringBounds()
विधि वर्तमान Graphics2D
फ़ॉन्ट, जो पाठ की एक पंक्ति स्ट्रिंग के लिए बहुत अच्छी तरह से काम करता है के लिए GlyphVector
पर आधारित है:
public class StringBoundsPanel extends JPanel
{
public StringBoundsPanel()
{
setBackground(Color.white);
setPreferredSize(new Dimension(400, 247));
}
@Override
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
// must be called before getStringBounds()
g2.setFont(getDesiredFont());
String str = "My Text";
float x = 140, y = 128;
Rectangle bounds = getStringBounds(g2, str, x, y);
g2.setColor(Color.red);
g2.drawString(str, x, y);
g2.setColor(Color.blue);
g2.draw(bounds);
g2.dispose();
}
private Rectangle getStringBounds(Graphics2D g2, String str,
float x, float y)
{
FontRenderContext frc = g2.getFontRenderContext();
GlyphVector gv = g2.getFont().createGlyphVector(frc, str);
return gv.getPixelBounds(null, x, y);
}
private Font getDesiredFont()
{
return new Font(Font.SANS_SERIF, Font.BOLD, 28);
}
private void startUI()
{
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(this);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) throws Exception
{
final StringBoundsPanel tb = new StringBoundsPanel();
SwingUtilities.invokeAndWait(new Runnable()
{
public void run()
{
tb.startUI();
}
});
}
}
ध्यान दें कि मैं स्पष्टता के लिए आयात हटा दिया है।
परिणाम:
FontMetrics.getAscent() और FontMetrics.getDescent() चाल चल सकता है।
आपको क्या लगता है कि यह गलत मान देता है? यह कहीं अधिक संभावना है कि आपकी वापसी की आपकी अपेक्षा विनिर्देश से मेल नहीं खाती है। ध्यान दें कि फ़ॉन्ट में कुछ ग्लिफ उन मानों के नीचे या नीचे जाते हैं, तो यह बिल्कुल ठीक है।
getMaxDescent()
और getMaxAscent()
फ़ॉन्ट में किसी भी ग्लिफ़ के लिए आप उन क्षेत्रों में से निरपेक्ष अधिकतम मूल्यों को बताना चाहिए।
यदि आप किसी विशिष्ट स्ट्रिंग के लिए मीट्रिक जानना चाहते हैं, तो आप निश्चित रूप से getLineMetrics()
पर कॉल करना चाहते हैं।
getHeight()
स्ट्रिंग के अवरोधकों को काट नहीं सकता है, केवल स्ट्रिंग को चित्रित कर सकते हैं। आप स्ट्रिंग को किसी भी तरह खींचने के लिए getHeight
से लौटाई गई ऊंचाई का उपयोग कर रहे हैं, और संभवतः आप ऊंचाई का दुरुपयोग कर रहे हैं। उदाहरण के लिए, यदि आप एक बॉक्स के निचले हिस्से में स्ट्रिंग के प्रारंभ बिंदु को प्राप्त करते हैं जो हाइट() उच्च है, तो आपके टेक्स्ट की आधार रेखा बॉक्स के निचले किनारे पर बैठेगी, और संभावना है कि अवरोधक बंद हो जाएंगे।
टेक्स्ट ज्यामिति एक जटिल विषय है, जो विचित्र ऐतिहासिक कलाकृतियों से जुड़ा हुआ है। जैसा कि अन्य ने सुझाव दिया है, getAscent
और getDescent
का उपयोग अपने बॉक्स के भीतर आधार रेखा को सही तरीके से स्थापित करने का प्रयास करने के लिए करें।
मैं हाल ही में नीचे दिए गए कोड लिखा था के रूप में मैं फ़ॉन्ट का विशिष्ट श्रेणियों के लिए पिक्सेल सही ऊंचाई माप (उदाहरण के लिए: सभी कम वर्ण, या सभी नंबरों) की जरूरत है।
यदि आपको तेज़ कोड (मेरे लूप के लिए है) की आवश्यकता है तो मैं एक सरणी में सभी मान (उदाहरण के लिए 1 से 100) प्राप्त करने के लिए स्टार्ट-अप पर इसे एक बार चलाने की अनुशंसा करता हूं और उसके बाद सरणी का उपयोग करता हूं।
कोड मूल रूप से 250x250 बिटमैप (यदि आवश्यक हो तो बढ़ाएं या कम करें) पर ओवरलैप किए गए उसी स्थान पर इनपुट स्ट्रिंग से सभी वर्ण खींचता है, तो यह शीर्ष से पिक्सल की तलाश शुरू करता है, फिर नीचे से, फिर यह अधिकतम ऊंचाई पाता है । यह सामान्य तारों के साथ काम करता है भले ही इसे चरित्र श्रेणियों के लिए डिज़ाइन किया गया हो। इसका मतलब यह है कि नियमित तारों का मूल्यांकन करते समय कुछ प्रकार की अनावश्यकता होती है क्योंकि कुछ पात्र दोहराते हैं। तो यदि आपकी आवेग स्ट्रिंग वर्णमाला गिनती (26) से अधिक है, तो 'tRange' imput: "abcd ... z" और अन्य वर्णों का उपयोग किया जा सकता है। यह तेज़ है।
उम्मीद है कि मदद करता है।
public int getFontPixelHeight(float inSize, Paint sourcePaint, String tRange)
{
// It is assumed that the font is already set in the sourcePaint
int bW = 250, bH = 250; // bitmap's width and height
int firstContact = -1, lastContact = -2; // Used when scanning the pixel rows. Initial values are set so that if no pixels found, the returned result is zero.
int tX = (int)(bW - inSize)/2, tY = (int)(bH - inSize)/2; // Used for a rough centering of the displayed characters
int tSum = 0;
// Preserve the original paint attributes
float oldSize = sourcePaint.getTextSize();
int oldColor = sourcePaint.getColor();
// Set the size/color
sourcePaint.setTextSize(inSize); sourcePaint.setColor(Color.WHITE);
// Create the temporary bitmap/canvas
Bitmap.Config bConf = Bitmap.Config.ARGB_8888;
Bitmap hld = Bitmap.createBitmap(250, 250, bConf);
Canvas canv = new Canvas(hld);
for (int i = 0; i < bH; i++)
{
for (int j = 0; j < bW; j++)
{
hld.setPixel(j, i, 0); // Zero all pixel values. This might seem redundant, but I am not quite sure that creating a blank bitmap means the pixel color value is indeed zero, and I need them to be zero so the addition performed below is correct.
}
}
// Display all characters overlapping at the same position
for (int i = 0; i < tRange.length(); i++)
{
canv.drawText("" + tRange.charAt(i), tX, tY, sourcePaint);
}
for (int i = 0; i < bH; i++)
{
for (int j = 0; j < bW; j++)
{
tSum = tSum + hld.getPixel(j, i);
}
if (tSum > 0) // If we found at least a pixel, save row index and exit loop
{
firstContact = i;
tSum = 0; // Reset
break;
}
}
for (int i = bH - 1; i > 0 ; i--)
{
for (int j = 0; j < bW; j++)
{
tSum = tSum + hld.getPixel(j, i);
}
if (tSum > 0) // If we found at least a pixel, save row index and exit loop
{
lastContact = i;
break;
}
}
// Restore the initial attributes, just in case the paint was passed byRef somehow
sourcePaint.setTextSize(oldSize);
sourcePaint.setColor(oldColor);
return lastContact - firstContact + 1;
}
- 1. टेक्स्टबॉक्स की असली ऊंचाई कैसे प्राप्त करें?
- 2. आईओएस - एक पत्र की "असली" ऊंचाई प्राप्त करें
- 3. रनटाइम पर जावा एप्लिकेशन का असली पथ कैसे प्राप्त करें?
- 4. एनएसएसटींग ऊंचाई प्राप्त करें
- 5. div टैग ऊंचाई प्राप्त करें
- 6. जावा में आखिरी कॉमा के बाद स्ट्रिंग कैसे प्राप्त करें?
- 7. एंड्रॉइड पर स्ट्रिंग चौड़ाई कैसे प्राप्त करें?
- 8. जावा में समय विभाजक प्रतीक कैसे प्राप्त करें? जावा में:
- 9. एक्शनबार की ऊंचाई प्राप्त करें
- 10. पाठ की चौड़ाई/ऊंचाई कैसे प्राप्त करें
- 11. शरीर तत्व की ऊंचाई कैसे प्राप्त करें
- 12. जावा में HTML कैसे प्राप्त करें
- 13. इंडेक्स द्वारा स्ट्रिंग कैरेक्टर प्राप्त करें - जावा
- 14. स्ट्रिंग में आउटपुटस्ट्रीम प्राप्त करें
- 15. जावा में स्ट्रिंग डिफ कैसे करें?
- 16. जावा स्ट्रिंग में उद्धरण कैसे दर्ज करें?
- 17. जावा में स्ट्रिंग को कैसे कंप्रेस करें?
- 18. सी #: स्ट्रिंग में स्ट्रिंग की लंबाई कैसे प्राप्त करें []
- 19. जावा में पैरेंट यूआरएल कैसे प्राप्त करें?
- 20. जावा में नया पॉइंटर कैसे प्राप्त करें?
- 21. जावा में यूनिक्स अपटाइम कैसे प्राप्त करें?
- 22. विंडोज टास्कबार (विनापी) की ऊंचाई प्राप्त करें
- 23. Jquery ऑटो ऊंचाई तत्व की ऊंचाई प्राप्त करें
- 24. असली पथ
- 25. जावा में FQDN प्राप्त करें
- 26. जावा में <स्ट्रिंग, स्ट्रिंग []> का स्ट्रिंग प्रस्तुति प्राप्त करने का आसान तरीका जावा में?
- 27. तत्व की पूरी ऊंचाई प्राप्त करें?
- 28. जावा: आप फ़ॉन्ट की टोपी ऊंचाई और एक्स-ऊंचाई कैसे प्राप्त करते हैं?
- 29. जावा में कॉलिंग क्लास का नाम कैसे प्राप्त करें?
- 30. सीएसएस स्क्रीन रिज़ॉल्यूशन की ऊंचाई प्राप्त करें
@nierito महान उत्तर और महान डेमो भी! आपने जो कहा है उसके आधार पर, मैंने आपके कोड को छोटा करने की कोशिश की है (मान लीजिए कि किसी ने 'फ़ॉन्ट' को परिभाषित किया है और इसे 'फ़ॉन्टमैट्रिक्स' मिला है।) यह काफी अच्छा काम करता है। 'फ़ॉन्ट।createGlyphVector (fontMetrics.getFontRenderContext(), टेक्स्ट) .getVisualBounds()। getHeight(); ' –
GlyphVector.getPixelBounds का उपयोग Font.getStringBounds और TextLayout.getBounds से कैसे तुलना करता है? क्या अधिक जटिल कोड के लिए कोई बड़ा फायदा है? एक साधारण परीक्षण में मैंने पाया कि फ़ॉन्ट विधि ने दो अन्य की तुलना में ऊंचाई की अधिक रिपोर्ट की है। मुझे यह पसंद है और टेक्स्टलाउट किसी को x और y बिंदु की आवश्यकता नहीं है। – jla
यह 8 साल है, लेकिन जब मैं g2d.scale (x, x) का उपयोग करता हूं; यह ठीक से प्रदर्शित नहीं कर सकता! – yelliver