2011-07-22 17 views
5

Tôi đã bị mắc kẹt trong việc chuyển đổi hình ảnh WMF/EMF thành định dạng hình ảnh chuẩn như JPG hoặc PNG bằng cách sử dụng Java.Làm cách nào để chuyển đổi WMF/EMF (MS metafiles) sang các hình ảnh chuẩn như JPG hoặc PNG bằng bất kỳ API Java nào?

Các tùy chọn tốt nhất có sẵn là gì?

+3

người sản xuất hình ảnh WMF/EMF nên bị bắn chết nhưng đối với những gì đáng giá: Tôi biết chắc chắn rằng ImageMagick * tuyệt vời (và miễn phí) * được sử dụng để có thể chuyển đổi các tệp WMF. Cũng đã từng là một trình bao bọc Java cho ImageMagick (được gọi là JMagick nếu bộ nhớ phục vụ). Vì vậy, bạn có thể muốn nhìn vào đó. Điều đó nói rằng tôi nhớ rằng WMF/EMF chỉ là "shell" hoặc "wrappers" xung quanh một loạt các định dạng, vì vậy nó có thể là một mục tiêu di chuyển và có thể rất nhiều ** ** của các tệp WMF/EMF khác nhau và tôi 'm thực sự không chắc chắn điều này vẫn được xử lý một cách chính xác. Nó được sử dụng để làm việc mà nói ... – SyntaxT3rr0r

Trả lời

0

Đây là một cách.

  1. Nhận (hoặc tạo) thành phần Java có thể hiển thị các tệp được đề cập.
  2. Tạo BufferedImage cùng kích thước với thành phần cần hiển thị hình ảnh.
  3. Lấy đối tượng Graphics từ BufferedImage.
  4. Gọi renderComponent.paintComponent(Graphics)
  5. Lưu hình ảnh bằng một trong các biến thể ImageIO.write().

Xem câu trả lời của tôi cho Swing: Obtain Image of JFrame cho các bước 2-5. Bước 1. là điều tôi muốn hỏi về Google.

+0

Có thể chỉ cho tôi một đoạn mã .. Vì vậy mà tôi có thể hiểu .. Tôi không thể tạo ra một hình ảnh (java.awt.Image) ra khỏi tập tin trong câu hỏi. Mà một lần nữa đặt ra một vấn đề trong việc tạo BufferedImage..Hy vọng bạn hiểu. – pinkb

1

wmf là định dạng tệp vectơ. Để có kết quả tốt nhất, hãy chuyển đổi chúng sang định dạng .svg hoặc .pdf. tôi đã làm nó theo hai giai đoạn

1) wmf2fig --auto XXXX.wmf

2) fig2pdf --nogv XXXX.fig

Tôi tạo ra một kịch bản python cho chuyển đổi số lượng lớn

import subprocess as sbp 
a = sbp.Popen("ls *.wmf",shell=True, stderr=sbp.PIPE, stdout=sbp.PIPE) 
filelist = a.communicate()[0].splitlines() 

for ele in filelist: 
    cmdarg = 'wmf2fig --auto '+ ele.rsplit('.',1)[0]+'.wmf' 
    a = sbp.Popen(cmdarg, shell=True, stderr=sbp.PIPE, stdout=sbp.PIPE) 
    out = a.communicate() 

for ele in filelist: 
    cmdarg = 'fig2pdf --nogv '+ ele.rsplit('.',1)[0]+'.fig' 
    a = sbp.Popen(cmdarg, shell=True, stderr=sbp.PIPE, stdout=sbp.PIPE) 
    out = a.communicate() 

cmdarg = 'rm *.fig' 
a = sbp.Popen(cmdarg, shell=True, stderr=sbp.PIPE, stdout=sbp.PIPE) 
out = a.communicate() 
+0

Trong khi câu trả lời không thực sự là về Java, tôi đồng ý có lẽ tốt nhất để giữ kết quả được chuyển đổi thành vectơ. Batik sẽ có thể chuyển đổi sang SVG. – haraldK

0

Tôi đã tạo một số trình bao bọc xung quanh gói Batik (như đã đề cập bởi vanje's answer) một thời gian trước đây, cung cấp hỗ trợ ImageIO cho SGV và WMF/EMF.

Với những plugin bạn sẽ có thể viết: Mã

ImageIO.write(ImageIO.read(wmfFile), pngFile, "png"); 

Nguồn trên GitHub.

Mặc dù plugin ImageIO thuận tiện, im4java và JMagick vẫn có thể hỗ trợ định dạng tốt hơn.

1

Nếu bạn đang triển khai ứng dụng của mình trong môi trường Windows, thì SWT có thể xử lý chuyển đổi cho bạn.

Image image = new Image(Display.getCurrent(), "test.wmf");     
    ImageLoader loader = new ImageLoader(); 
    loader.data = new ImageData[] { image.getImageData() }; 
    try(FileOutputStream stream = new FileOutputStream("test.png")) 
    { 
     loader.save(stream, SWT.IMAGE_PNG); 
    } 
    image.dispose(); 

Mục đích của SWT là cung cấp trình bao bọc Java xung quanh chức năng gốc và trong trường hợp này, gọi trực tiếp GDI cửa sổ để hiển thị WMF.

Các vấn đề liên quan