2009-04-06 27 views
10

मैं वर्तमान में एक पीएनजी फ़ाइल लिखने के लिए javax.imageio.ImageIO का उपयोग कर रहा हूं। मैं एक टेक्स्ट खंड (और वास्तव में किसी भी भाग listed here) को शामिल करना चाहता हूं, लेकिन ऐसा करने का कोई मतलब नहीं देख सकता।मैं जावा से टेक्स्ट या आईटीएक्सटी खंड के साथ एक पीएनजी कैसे सहेज सकता हूं?

com.sun.imageio.plugins.png.PNGMetadata के रूप में यह संभव होना चाहिए।

मुझे किसी भी सुराग या उत्तरों के लिए सबसे आभारी होना चाहिए।

एम

उत्तर

9

समाधान मैं कुछ decompilation के बाद, इस प्रकार है पर मारा ...

RenderedImage image = getMyImage();   
Iterator<ImageWriter> iterator = ImageIO.getImageWritersBySuffix("png"); 

if(!iterator.hasNext()) throw new Error("No image writer for PNG"); 

ImageWriter imagewriter = iterator.next(); 
ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
imagewriter.setOutput(ImageIO.createImageOutputStream(bytes)); 

// Create & populate metadata 
PNGMetadata metadata = new PNGMetadata(); 
// see http://www.w3.org/TR/PNG-Chunks.html#C.tEXt for standardized keywords 
metadata.tEXt_keyword.add("Title"); 
metadata.tEXt_text.add("Mandelbrot"); 
metadata.tEXt_keyword.add("Comment"); 
metadata.tEXt_text.add("..."); 
metadata.tEXt_keyword.add("MandelbrotCoords"); // custom keyword 
metadata.tEXt_text.add(fractal.getCoords().toString());   

// Render the PNG to memory 
IIOImage iioImage = new IIOImage(image, null, null); 
iioImage.setMetadata(metadata); // Attach the metadata 
imagewriter.write(null, iioImage, null); 
0

Sixlegs जावा पीएनजी पुस्तकालय (http://sixlegs.com/software/png/) की कोशिश करो। यह सभी खंड प्रकारों के लिए समर्थन रखने का दावा करता है और निजी खंड प्रबंधन करता है।

+0

कि केवल डिकोडिंग के लिए नहीं है लिखने के लिए पूर्ण नियंत्रण देता है? – axel22

0

हम JGraphX परियोजना में यह करते हैं। स्रोत कोड डाउनलोड करें और com.mxgraph.util.png पैकेज में एक नज़र डालें, वहां आपको एन्कोडिंग के लिए तीन कक्षाएं मिलेंगी जिन्हें हमने अपाचे बटिक स्रोतों से कॉपी किया था। SaveXmlPng विधि में com.mxgraph.examples.swing.editor.EditorActions में उपयोग का एक उदाहरण है। कुछ संपादित एक कोड की तरह दिखता है:

mxPngEncodeParam param = mxPngEncodeParam 
    .getDefaultEncodeParam(image); 
param.setCompressedText(new String[] { "mxGraphModel", xml }); 

// Saves as a PNG file 
FileOutputStream outputStream = new FileOutputStream(new File(
    filename)); 
try 
{ 
mxPngImageEncoder encoder = new mxPngImageEncoder(outputStream, 
    param); 

if (image != null) 
{ 
    encoder.encode(image); 
} 
} 
finally 
{ 
outputStream.close(); 
} 

कहाँ छवि BufferedImage कि .PNG बनेगी और xml स्ट्रिंग हम iTxt खंड में जगह करना चाहते हैं है। "mxGraphModel" उस XML स्ट्रिंग के लिए कुंजी है (अनुभाग में कुछ कुंजी/मान जोड़े शामिल हैं), जाहिर है कि आप इसे अपनी कुंजी से प्रतिस्थापित करते हैं।

com.mxgraph.util.png के तहत भी हमने एक बहुत ही सरल वर्ग लिखा है जो पूरी छवि को संसाधित किए बिना iTxt निकालता है। आप setCompressedText() के बजाय mxPngEncodeParam.setText का उपयोग कर टेक्स्ट खंड के लिए एक ही विचार लागू कर सकते हैं, लेकिन संकुचित पाठ अनुभाग काफी बड़े टेक्स्ट अनुभागों की अनुमति देता है।

0

मुझे पता है इस सवाल का लंबा है के बाद से उत्तर दिया, लेकिन यदि आप "com.sun" पदानुक्रम में डुबकी के बिना यह करना चाहते हैं, यहाँ एक त्वरित और बहुत बदसूरत उदाहरण है के रूप में मैं इस कहीं और दस्तावेज नहीं मिल सका।

BufferedImage img = new BufferedImage(300, 300, BufferedImage.TYPE_INT_ARGB); 

// Create a DOM Document describing the metadata; 
// I've gone the quick and dirty route. The description for PNG is at 
// [http://download.oracle.com/javase/1.4.2/docs/api/javax/imageio/metadata/doc-files/png_metadata.html][1] 

Calendar c = Calendar.getInstance(); 
String xml = "<?xml version='1.0'?><javax_imageio_png_1.0><tIME year='"+c.get(c.YEAR)+"' month='"+(c.get(c.MONTH)+1)+"' day='"+c.get(c.DAY_OF_MONTH)+"' hour='"+c.get(c.HOUR_OF_DAY)+"' minute='"+c.get(c.MINUTE)+"' second='"+c.get(c.SECOND)+"'/><pHYs pixelsPerUnitXAxis='"+11811+"' pixelsPerUnitYAxis='"+11811+"' unitSpecifier='meter'/></javax_imageio_png_1.0>"; 
DOMResult domresult = new DOMResult(); 
TransformerFactory.newInstance().newTransformer().transform(new StreamSource(new StringReader(xml)), domresult); 
Document document = dom.getResult(); 

// Apply the metadata to the image 
ImageWriter writer = (ImageWriter)ImageIO.getImageWritersBySuffix("png").next(); 
IIOMetadata meta = writer.getDefaultImageMetadata(new ImageTypeSpecifier(img), null); 
meta.setFromTree(meta.getMetadataFormatNames()[0], document.getFirstChild()); 
FileOutputStream out = new FileOutputStream("out.png"); 
writer.setOutput(ImageIO.createImageOutputStream(out)); 
writer.write(new IIOImage(img, null, meta)); 
out.close(); 
1

जावा 1.6 का उपयोग करना, मैं

Document document = dom.getResult(); 

इसके अलावा

Node document = domresult.getNode(); 
अपनी लाइन के बजाय

को माइक कोड संपादित, मैं एक लाइन

writer.dispose() 
जोड़ने के लिए सुझाव देंगे नौकरी के बाद

, ताकि कोई भी आर लेखक द्वारा आयोजित स्रोत जारी किए गए हैं।

0

पुराना सवाल है, लेकिन ... PNGJ पढ़ने और PNG हिस्सा

संबंधित मुद्दे

 संबंधित मुद्दे