100分求:如何打印图片?

猛将 2001-12-03 05:47:20
现在在我得到了一个image对象并可以显示到application界面上,现要将通过打印机它打印出来,请问如何做??最好有源代码!谢谢!100分答谢!
...全文
582 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
猛将 2001-12-08
  • 打赏
  • 举报
回复
很好,多谢了。
你这个例子是打印现有的文件,有没有办法打印一个已经存在的Image对象?
javamap 2001-12-05
  • 打赏
  • 举报
回复
//Here you go:
/**
JPEGEditor
Image of earth from http://earth.jsc.nasa.gov/
*/
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.util.*;
import java.io.*;

import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.*;
import javax.swing.filechooser.*;

import com.sun.image.codec.jpeg.*;

import java.awt.print.*;

public class JPEGEditor extends JFrame
{
public final static Dimension VERTICAL_RIGID_SIZE
= new Dimension(1,3);
public final static Dimension HORIZONTAL_RIGID_SIZE
= new Dimension(3,1);

protected File m_currentDir = new File(".");
protected File m_currentFile = null;

protected JFileChooser m_chooser;
protected JPEGPanel m_panel;
protected JSlider m_slHorzDensity;
protected JSlider m_slVertDensity;
protected JSlider m_slQuality;

protected BufferedImage m_bi1, m_bi2;

public JPEGEditor() {
super("JPEG Editor");
setSize(600, 400);

m_chooser = new JFileChooser();
SimpleFilter filter = new SimpleFilter("jpg",
"JPEG Image Files");
m_chooser.setFileFilter(filter);
m_chooser.setCurrentDirectory(m_currentDir);

m_panel = new JPEGPanel();
JScrollPane ps = new JScrollPane(m_panel,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
getContentPane().add(ps, BorderLayout.CENTER);

JPanel p, p1;

m_slVertDensity = new JSlider(JSlider.VERTICAL,
100, 500, 300);
m_slVertDensity.setExtent(50);
m_slVertDensity.setPaintLabels(true);
m_slVertDensity.setMajorTickSpacing(100);
m_slVertDensity.setMinorTickSpacing(50);
m_slVertDensity.setPaintTicks(true);
m_slVertDensity.putClientProperty("JSlider.isFilled", Boolean.TRUE);

p = new JPanel();
p.setBorder(new TitledBorder(new EtchedBorder(),
"Vert. dens."));
p.add(Box.createRigidArea(HORIZONTAL_RIGID_SIZE));
p.add(m_slVertDensity);
p.add(Box.createRigidArea(HORIZONTAL_RIGID_SIZE));
getContentPane().add(p, BorderLayout.EAST);

m_slHorzDensity = new JSlider(JSlider.HORIZONTAL,
100, 500, 300);
m_slHorzDensity.setExtent(50);
m_slHorzDensity.setPaintLabels(true);
m_slHorzDensity.setMajorTickSpacing(100);
m_slHorzDensity.setMinorTickSpacing(50);
m_slHorzDensity.setPaintTicks(true);
m_slHorzDensity.putClientProperty("JSlider.isFilled", Boolean.TRUE);

p = new JPanel();
p.setBorder(new TitledBorder(new EtchedBorder(),
"Horizontal density"));
p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS));
p.add(Box.createRigidArea(VERTICAL_RIGID_SIZE));
p.add(m_slHorzDensity);
p.add(Box.createRigidArea(VERTICAL_RIGID_SIZE));
p1 = new JPanel();
p.setLayout(new BoxLayout(p, BoxLayout.X_AXIS));
p1.add(p);

m_slQuality = new JSlider(JSlider.HORIZONTAL,
0, 100, 100);
Hashtable labels = new Hashtable(6);
for (float q = 0; q <= 1.0; q += 0.2)
labels.put(new Integer((int)(q*100)),
new JLabel("" + q, JLabel.CENTER ));
m_slQuality.setLabelTable(labels);
m_slQuality.setExtent(10);
m_slQuality.setPaintLabels(true);
m_slQuality.setMinorTickSpacing(10);
m_slQuality.setPaintTicks(true);
m_slQuality.putClientProperty("JSlider.isFilled", Boolean.TRUE);

p = new JPanel();
p.setBorder(new TitledBorder(new EtchedBorder(),
"Quality"));
p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS));
p.add(Box.createRigidArea(VERTICAL_RIGID_SIZE));
p.add(m_slQuality);
p.add(Box.createRigidArea(VERTICAL_RIGID_SIZE));
p1.add(p);

JButton btApply = new JButton("Apply");
ActionListener lst = new ActionListener() {
public void actionPerformed(ActionEvent e) {
apply();
}
};
btApply.addActionListener(lst);
p1.add(btApply);

JButton btReset = new JButton("Reset");
lst = new ActionListener() {
public void actionPerformed(ActionEvent e) {
reset();
}
};
btReset.addActionListener(lst);
p1.add(btReset);
getContentPane().add(p1, BorderLayout.SOUTH);

setJMenuBar(createMenuBar());

WindowListener wndCloser = new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
};
addWindowListener(wndCloser);

setVisible(true);
}

protected JMenuBar createMenuBar() {
JMenuBar menuBar = new JMenuBar();

JMenu mFile = new JMenu("File");
mFile.setMnemonic('f');

JMenuItem mItem = new JMenuItem("Open...");
mItem.setMnemonic('o');
ActionListener lst = new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (m_chooser.showOpenDialog(JPEGEditor.this) !=
JFileChooser.APPROVE_OPTION)
return;
m_currentDir = m_chooser.getCurrentDirectory();
File fChoosen = m_chooser.getSelectedFile();
openFile(fChoosen);
}
};
mItem.addActionListener(lst);
mFile.add(mItem);

mItem = new JMenuItem("Save");
mItem.setMnemonic('s');
lst = new ActionListener() {
public void actionPerformed(ActionEvent e) {
saveFile(m_currentFile);
}
};
mItem.addActionListener(lst);
mFile.add(mItem);

mItem = new JMenuItem("Save As...");
mItem.setMnemonic('a');
lst = new ActionListener() {
public void actionPerformed(ActionEvent e) {
m_chooser.setSelectedFile(m_currentFile);
if (m_chooser.showSaveDialog(JPEGEditor.this) !=
JFileChooser.APPROVE_OPTION)
return;
m_currentDir = m_chooser.getCurrentDirectory();
File fChoosen = m_chooser.getSelectedFile();
if (fChoosen!=null && fChoosen.exists()) {
String message = "File " + fChoosen.getName()+
" already exists. Override?";
int result = JOptionPane.showConfirmDialog(
JPEGEditor.this, message, getTitle(),
JOptionPane.YES_NO_OPTION);
if (result != JOptionPane.YES_OPTION)
return;
}
setCurrentFile(fChoosen);
saveFile(fChoosen);
}
};
mItem.addActionListener(lst);
mFile.add(mItem);

mFile.addSeparator();

mItem = new JMenuItem("Print...");
mItem.setMnemonic('p');
ActionListener lstPrint = new ActionListener() {
public void actionPerformed(ActionEvent e) {
Thread runner = new Thread() {
public void run() {
if (m_panel.getBufferedImage() != null)
printData();
}
};
runner.start();
}
};
mItem.addActionListener(lstPrint);
mFile.add(mItem);

mItem = new JMenuItem("Print Preview");
mItem.setMnemonic('v');
ActionListener lstPreview = new ActionListener() {
public void actionPerformed(ActionEvent e) {
Thread runner = new Thread() {
public void run() {
setCursor(Cursor.getPredefinedCursor(
Cursor.WAIT_CURSOR));
if (m_panel.getBufferedImage() != null)
new PrintPreview(m_panel,
m_currentFile.getName()+" preview");
setCursor(Cursor.getPredefinedCursor(
Cursor.DEFAULT_CURSOR));
}
};
runner.start();
}
};
mItem.addActionListener(lstPreview);
mFile.add(mItem);

mFile.addSeparator();

mItem = new JMenuItem("Exit");
mItem.setMnemonic('x');
lst = new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
};
mItem.addActionListener(lst);
mFile.add(mItem);
menuBar.add(mFile);
return menuBar;
}

protected void setCurrentFile(File file) {
if (file != null) {
m_currentFile = file;
setTitle("JPEG Editor ["+file.getName()+"]");
}
}

protected void openFile(final File file) {
if (file == null || !file.exists())
return;
setCurrentFile(file);

setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
Thread runner = new Thread() {
public void run() {
try {
FileInputStream in = new FileInputStream(file);
JPEGImageDecoder decoder =
JPEGCodec.createJPEGDecoder(in);
m_bi1 = decoder.decodeAsBufferedImage();
m_bi2 = null;
in.close();
SwingUtilities.invokeLater( new Runnable() {
public void run() { reset(); }
});
}
catch (Exception ex) {
ex.printStackTrace();
System.err.println("openFile: "+ex.toString());
}
setCursor(Cursor.getPredefinedCursor(
Cursor.DEFAULT_CURSOR));
}
};
runner.start();
}

protected void saveFile(final File file) {
if (file == null || m_panel.getBufferedImage() == null)
return;

setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
Thread runner = new Thread() {
public void run() {
try {
FileOutputStream out = new FileOutputStream(file);
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(m_panel.getBufferedImage());
out.close();
}
catch (Exception ex) {
ex.printStackTrace();
System.err.println("apply: "+ex.toString());
}
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
};
runner.start();
}

protected void apply() {
if (m_bi1 == null)
return;

setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
Thread runner = new Thread() {
public void run() {
try {
ByteArrayOutputStream out = new ByteArrayOutputStream();
JPEGImageEncoder encoder =
JPEGCodec.createJPEGEncoder(out);
JPEGEncodeParam param =
encoder.getDefaultJPEGEncodeParam(m_bi1);

float quality = m_slQuality.getValue()/100.0f;
param.setQuality(quality, false);

param.setDensityUnit(
JPEGEncodeParam.DENSITY_UNIT_DOTS_INCH);
int xDensity = m_slHorzDensity.getValue();
param.setXDensity(xDensity);
int yDensity = m_slVertDensity.getValue();
param.setYDensity(yDensity);

encoder.setJPEGEncodeParam(param);
encoder.encode(m_bi1);

ByteArrayInputStream in = new ByteArrayInputStream(
out.toByteArray());
JPEGImageDecoder decoder =
JPEGCodec.createJPEGDecoder(in);
final BufferedImage bi2 = decoder.decodeAsBufferedImage();
SwingUtilities.invokeLater( new Runnable() {
public void run() {
m_panel.setBufferedImage(bi2);
}
});
}
catch (Exception ex) {
ex.printStackTrace();
System.err.println("apply: "+ex.toString());
}
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
};
runner.start();
}

protected void reset() {
if (m_bi1 != null) {
m_panel.setBufferedImage(m_bi1);
m_slQuality.setValue(100);
m_slHorzDensity.setValue(300);
m_slVertDensity.setValue(300);
}
}

public void printData() {
getJMenuBar().repaint();
try {
PrinterJob prnJob = PrinterJob.getPrinterJob();
prnJob.setPrintable(m_panel);
if (!prnJob.printDialog())
return;
setCursor( Cursor.getPredefinedCursor(
Cursor.WAIT_CURSOR));
prnJob.print();
setCursor( Cursor.getPredefinedCursor(
Cursor.DEFAULT_CURSOR));
JOptionPane.showMessageDialog(this,
"Printing completed successfully", "JPEGEditor2",
JOptionPane.INFORMATION_MESSAGE);
}
catch (PrinterException e) {
e.printStackTrace();
System.err.println("Printing error: "+e.toString());
}
}

public static void main(String argv[]) {
new JPEGEditor();
}
}

class JPEGPanel extends JPanel implements Printable
{
protected BufferedImage m_bi = null;

public int m_maxNumPage = 1;

public JPEGPanel() {}

public void setBufferedImage(BufferedImage bi) {
if (bi == null)
return;
m_bi = bi;
Dimension d = new Dimension(m_bi.getWidth(this),
m_bi.getHeight(this));
setPreferredSize(d);
revalidate();
repaint();
}

public void paintComponent(Graphics g) {
super.paintComponent(g);
Dimension d = getSize();
g.setColor(getBackground());
g.fillRect(0, 0, d.width, d.height);
if (m_bi != null)
g.drawImage(m_bi, 0, 0, this);
}

public BufferedImage getBufferedImage() {
return m_bi;
}

public int print(Graphics pg, PageFormat pageFormat,
int pageIndex) throws PrinterException {
if (pageIndex >= m_maxNumPage || m_bi == null)
return NO_SUCH_PAGE;

pg.translate((int)pageFormat.getImageableX(),
(int)pageFormat.getImageableY());
int wPage = (int)pageFormat.getImageableWidth();
int hPage = (int)pageFormat.getImageableHeight();

int w = m_bi.getWidth(this);
int h = m_bi.getHeight(this);
if (w == 0 || h == 0)
return NO_SUCH_PAGE;
int nCol = Math.max((int)Math.ceil((double)w/wPage), 1);
int nRow = Math.max((int)Math.ceil((double)h/hPage), 1);
m_maxNumPage = nCol*nRow;

int iCol = pageIndex % nCol;
int iRow = pageIndex / nCol;
int x = iCol*wPage;
int y = iRow*hPage;
int wImage = Math.min(wPage, w-x);
int hImage = Math.min(hPage, h-y);

pg.drawImage(m_bi, 0, 0, wImage, hImage,
x, y, x+wImage, y+hImage, this);
System.gc();

return PAGE_EXISTS;
}
}


class SimpleFilter
extends javax.swing.filechooser.FileFilter
{
private String m_description = null;
private String m_extension = null;

public SimpleFilter(String extension, String description) {
m_description = description;
m_extension = "."+extension.toLowerCase();
}

public String getDescription() {
return m_description;
}

public boolean accept(File f) {
if (f == null)
return false;
if (f.isDirectory())
return true;
return f.getName().toLowerCase().endsWith(m_extension);
}
}

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.util.*;
import java.awt.print.*;

import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.*;

public class PrintPreview extends JFrame
{
protected int m_wPage;
protected int m_hPage;
protected Printable m_target;
protected JComboBox m_cbScale;
protected PreviewContainer m_preview;

public PrintPreview(Printable target) {
this(target, "Print Preview");
}

public PrintPreview(Printable target, String title) {
super(title);
setSize(600, 400);
m_target = target;

JToolBar tb = new JToolBar();
JButton bt = new JButton("Print", new ImageIcon("print.gif"));
ActionListener lst = new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
// Use default printer, no dialog
PrinterJob prnJob = PrinterJob.getPrinterJob();
prnJob.setPrintable(m_target);
setCursor( Cursor.getPredefinedCursor(
Cursor.WAIT_CURSOR));
prnJob.print();
setCursor( Cursor.getPredefinedCursor(
Cursor.DEFAULT_CURSOR));
dispose();
}
catch (PrinterException ex) {
ex.printStackTrace();
System.err.println("Printing error: "+ex.toString());
}
}
};
bt.addActionListener(lst);
bt.setAlignmentY(0.5f);
bt.setMargin(new Insets(4,6,4,6));
tb.add(bt);

bt = new JButton("Close");
lst = new ActionListener() {
public void actionPerformed(ActionEvent e) {
dispose();
}
};
bt.addActionListener(lst);
bt.setAlignmentY(0.5f);
bt.setMargin(new Insets(2,6,2,6));
tb.add(bt);

String[] scales = { "10 %", "25 %", "50 %", "100 %" };
m_cbScale = new JComboBox(scales);
lst = new ActionListener() {
public void actionPerformed(ActionEvent e) {
Thread runner = new Thread() {
public void run() {
String str = m_cbScale.getSelectedItem().
toString();
if (str.endsWith("%"))
str = str.substring(0, str.length()-1);
str = str.trim();
int scale = 0;
try { scale = Integer.parseInt(str); }
catch (NumberFormatException ex) { return; }
int w = (int)(m_wPage*scale/100);
int h = (int)(m_hPage*scale/100);

Component[] comps = m_preview.getComponents();
for (int k=0; k<comps.length; k++) {
if (!(comps[k] instanceof PagePreview))
continue;
PagePreview pp = (PagePreview)comps[k];
pp.setScaledSize(w, h);
}
m_preview.doLayout();
m_preview.getParent().getParent().validate();
}
};
runner.start();
}
};
m_cbScale.addActionListener(lst);
m_cbScale.setMaximumSize(m_cbScale.getPreferredSize());
m_cbScale.setEditable(true);
tb.addSeparator();
tb.add(m_cbScale);
getContentPane().add(tb, BorderLayout.NORTH);

m_preview = new PreviewContainer();

PrinterJob prnJob = PrinterJob.getPrinterJob();
PageFormat pageFormat = prnJob.defaultPage();
if (pageFormat.getHeight()==0 || pageFormat.getWidth()==0) {
System.err.println("Unable to determine default page size");
return;
}
m_wPage = (int)(pageFormat.getWidth());
m_hPage = (int)(pageFormat.getHeight());
int scale = 10;
int w = (int)(m_wPage*scale/100);
int h = (int)(m_hPage*scale/100);

int pageIndex = 0;
try {
while (true) {
BufferedImage img = new BufferedImage(m_wPage,
m_hPage, BufferedImage.TYPE_INT_RGB);
Graphics g = img.getGraphics();
g.setColor(Color.white);
g.fillRect(0, 0, m_wPage, m_hPage);
if (target.print(g, pageFormat, pageIndex) !=
Printable.PAGE_EXISTS)
break;
PagePreview pp = new PagePreview(w, h, img);
m_preview.add(pp);
pageIndex++;
}
}
catch (PrinterException e) {
e.printStackTrace();
System.err.println("Printing error: "+e.toString());
}

JScrollPane ps = new JScrollPane(m_preview);
getContentPane().add(ps, BorderLayout.CENTER);

setDefaultCloseOperation(DISPOSE_ON_CLOSE);
setVisible(true);
}

class PreviewContainer extends JPanel
{
protected int H_GAP = 16;
protected int V_GAP = 10;

public Dimension getPreferredSize() {
int n = getComponentCount();
if (n == 0)
return new Dimension(H_GAP, V_GAP);
Component comp = getComponent(0);
Dimension dc = comp.getPreferredSize();
int w = dc.width;
int h = dc.height;

Dimension dp = getParent().getSize();
int nCol = Math.max((dp.width-H_GAP)/(w+H_GAP), 1);
int nRow = n/nCol;
if (nRow*nCol < n)
nRow++;

int ww = nCol*(w+H_GAP) + H_GAP;
int hh = nRow*(h+V_GAP) + V_GAP;
Insets ins = getInsets();
return new Dimension(ww+ins.left+ins.right,
hh+ins.top+ins.bottom);
}

public Dimension getMaximumSize() {
return getPreferredSize();
}

public Dimension getMinimumSize() {
return getPreferredSize();
}

public void doLayout() {
Insets ins = getInsets();
int x = ins.left + H_GAP;
int y = ins.top + V_GAP;

int n = getComponentCount();
if (n == 0)
return;
Component comp = getComponent(0);
Dimension dc = comp.getPreferredSize();
int w = dc.width;
int h = dc.height;

Dimension dp = getParent().getSize();
int nCol = Math.max((dp.width-H_GAP)/(w+H_GAP), 1);
int nRow = n/nCol;
if (nRow*nCol < n)
nRow++;

int index = 0;
for (int k = 0; k<nRow; k++) {
for (int m = 0; m<nCol; m++) {
if (index >= n)
return;
comp = getComponent(index++);
comp.setBounds(x, y, w, h);
x += w+H_GAP;
}
y += h+V_GAP;
x = ins.left + H_GAP;
}
}
}

class PagePreview extends JPanel
{
protected int m_w;
protected int m_h;
protected Image m_source;
protected Image m_img;

public PagePreview(int w, int h, Image source) {
m_w = w;
m_h = h;
m_source= source;
m_img = m_source.getScaledInstance(m_w, m_h,
Image.SCALE_SMOOTH);
m_img.flush();
setBackground(Color.white);
setBorder(new MatteBorder(1, 1, 2, 2, Color.black));
}

public void setScaledSize(int w, int h) {
m_w = w;
m_h = h;
m_img = m_source.getScaledInstance(m_w, m_h,
Image.SCALE_SMOOTH);
repaint();
}

public Dimension getPreferredSize() {
Insets ins = getInsets();
return new Dimension(m_w+ins.left+ins.right,
m_h+ins.top+ins.bottom);
}

public Dimension getMaximumSize() {
return getPreferredSize();
}

public Dimension getMinimumSize() {
return getPreferredSize();
}

public void paint(Graphics g) {
g.setColor(getBackground());
g.fillRect(0, 0, getWidth(), getHeight());
g.drawImage(m_img, 0, 0, this);
paintBorder(g);
}
}
}
猛将 2001-12-04
  • 打赏
  • 举报
回复
没有人遇到过这种问题吗?
skyyoung 2001-12-03
  • 打赏
  • 举报
回复
http://www.nevaobject.com/java/index.htm

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧