怎样用JMagick合并两幅图片??? 用java普通类合并图片合并出来的质量不怎么好,想用JMagick合并。怎样可以合并呢?最好有原码?? (分数没了,以后再还大家!) 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 package pic;import java.awt.*;import java.io.*;import java.net.*;import java.awt.event.*;import java.awt.image.*;import javax.swing.*;public class effect extends JApplet implements Runnable { //定义变量 Toolkit toolkit; int totalBlocks = 0; //图像被分解成的块数,默认为 宽X高 int[] blocks; //保存块数的信息 Image[] bufferImage = new Image[2]; //屏幕上的图形缓冲 VolatileImage offScreenImage; Image imageBuf; //保存图片缓冲区内容 Graphics2D offScreenGraphics; Thread thread; MediaTracker mediaTracker; boolean[] isImageReady; //图片是否已经装载 MemoryImageSource memoryimagesource; int imageWidth, imageHeight; //图像的宽及高 int[] pixelA, pixelB; int[] redA, greenA, blueA, redB, greenB, blueB; public effect() throws HeadlessException { bufferImage[0] = getImage("a.jpg"); bufferImage[1] = getImage("b.jpg"); if ( (bufferImage[0].getWidth(this) != bufferImage[1].getWidth(this)) || (bufferImage[0].getHeight(this) != bufferImage[1].getHeight(this))) { System.out.println("图像尺寸不一致!"); return; } toolkit = getToolkit(); imageWidth = bufferImage[0].getWidth(this); imageHeight = bufferImage[0].getHeight(this); totalBlocks = imageWidth * imageHeight; //计算分解的块数 blocks = new int[totalBlocks]; pixelA = new int[totalBlocks]; pixelB = new int[totalBlocks]; redA = new int[totalBlocks]; greenA = new int[totalBlocks]; blueA = new int[totalBlocks]; redB = new int[totalBlocks]; greenB = new int[totalBlocks]; blueB = new int[totalBlocks]; GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice gd = ge.getDefaultScreenDevice(); GraphicsConfiguration gc = gd.getDefaultConfiguration(); offScreenImage = gc.createCompatibleVolatileImage(imageWidth, imageHeight); //创建图像缓冲 offScreenGraphics = offScreenImage.createGraphics(); //取得缓冲的graphics对象 } public void init() { getImagePixels(bufferImage[0], pixelA); getImagePixels(bufferImage[1], pixelB); for (int i = 0; i < totalBlocks; i++) { blocks[i] = pixelA[i]; //保存图像A的像素信息 redA[i] = pixelA[i] & 0xff0000; //保存图像B的red值 greenA[i] = pixelA[i] & 0x00ff00; //保存图像B的green值 blueA[i] = pixelA[i] & 0x0000ff; //保存图像B的blue值 redB[i] = pixelB[i] & 0xff0000; //保存图像B的red值 greenB[i] = pixelB[i] & 0x00ff00; //保存图像B的green值 blueB[i] = pixelB[i] & 0x0000ff; //保存图像B的blue值 } prepareImagePixels(); //将像素信息还原为图像 } public void run() { //检查java版本 String javaVersion; try { javaVersion = System.getProperty("java.version"); } catch (SecurityException _ex) { javaVersion = "unk"; } if (javaVersion.startsWith("1.0")) { System.out.println("require java 1.1 or later version!"); return; } try { thread.sleep(3000l); } catch (InterruptedException ex1) { } int line = 0; Thread currentThread = Thread.currentThread(); while (line < imageHeight && thread == currentThread) { for (int i = 0; i < imageWidth; i++) { int offset = line * imageWidth + i; blocks[offset] = pixelB[offset]; //与下一被注释的语句作用相同 //blocks[offset] = redB[offset] | greenB[offset] | blueB[offset]; } memoryimagesource.newPixels(); //生成新的图像 line++; repaint(); //适当延时 try { thread.sleep(20l); } catch (InterruptedException ex) { } } } public void paint(Graphics g) { if (offScreenGraphics != null) { //保证在destory()时不引发异常 offScreenGraphics.drawImage(imageBuf, 0, 0, this); g.drawImage(offScreenImage, 0, 0, this); } } public void start() { if (thread == null) { thread = new Thread(this); thread.start(); } } public void stop() { thread = null; } public final void update(Graphics g) { paint(g); } public void destroy() { if (offScreenImage != null) { offScreenImage.flush(); } offScreenImage = null; if (offScreenGraphics != null) { offScreenGraphics.dispose(); } offScreenGraphics = null; System.gc(); } /** * 通过给定的文件名获得图像 * @param filename 给定图像的文件名 * @return 图像 */ Image getImage(String filename) { URLClassLoader urlLoader = (URLClassLoader)this.getClass().getClassLoader(); URL url = null; Image image = null; url = urlLoader.findResource(filename); image = Toolkit.getDefaultToolkit().getImage(url); MediaTracker mediatracker = new MediaTracker(this); try { mediatracker.addImage(image, 0); mediatracker.waitForID(0); } catch (InterruptedException _ex) { image = null; } if (mediatracker.isErrorID(0)) { image = null; } return image; } /** * 取得给定图像的像素数组 * @param image 指定的图像 * @param pixels 保存像素信息的数组 * @return 成功返回true */ private boolean getImagePixels(Image image, int pixels[]) { PixelGrabber pixelgrabber = new PixelGrabber(image, 0, 0, imageWidth, imageHeight, pixels, 0, imageWidth); try { pixelgrabber.grabPixels(); } catch (InterruptedException _ex) { return false; } return true; } /** * 将像素数组还原为图像 */ void prepareImagePixels() { memoryimagesource = new MemoryImageSource(imageWidth, imageHeight, new DirectColorModel(24, 0xff0000, 0x00ff00, 0x0000ff), blocks, 0, imageWidth); try { memoryimagesource.setAnimated(true); memoryimagesource.setFullBufferUpdates(true); imageBuf = createImage(memoryimagesource); memoryimagesource.newPixels(); //生成新的图像 } catch (NoSuchMethodError _ex) { } } /** * 取得图像的宽度 * @return 宽度 */ public int getWidth() { return imageWidth; } /** * 取得图像的高度 * @return 高度 */ public int getHeight() { return imageHeight; } public static void main(String args[]) { JFrame frame = new JFrame("Demo"); effect e = new effect(); e.init(); e.start(); frame.getContentPane().setLayout(new BorderLayout()); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setResizable(false); frame.getContentPane().add(e); frame.setSize(new Dimension(e.getWidth() + 6, e.getHeight() + 20)); Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); Dimension frameSize = frame.getSize(); frame.setLocation( (screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2); frame.show(); }}不知这行不行,就是用两幅图片的像素来合成一张图片,然后显示,且是动态的.网上下的. 用常用的方法很简单就可以合并拉! 我是想用JMagick合并两幅图片。因为图片是用来冲洗照片的,质量要很好才行!!所以要用JMagick包,但不知道怎样可以合并?? java泛型擦除 这两程序的结果为何不一样?? 关于构造器的两点总结 java基础问题???? “线程安全的对象”,你是如何理解的? 关于HashMap中value的问题 诚求lucene二次开发小项目,分不够可以再加几百 求大神啊,3个java试题。求解! 我的机器有jdk1.1.8,如何才能卸载? 关于Java线程等待唤醒机制的一个问题 求:将jpeg格式图象转换为gif格式 !!!!!!! 如何读取sql server中的image字段并转换成字符串?
import java.io.*;
import java.net.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.*;public class effect
extends JApplet
implements Runnable {
//定义变量
Toolkit toolkit;
int totalBlocks = 0; //图像被分解成的块数,默认为 宽X高
int[] blocks; //保存块数的信息
Image[] bufferImage = new Image[2]; //屏幕上的图形缓冲
VolatileImage offScreenImage;
Image imageBuf; //保存图片缓冲区内容
Graphics2D offScreenGraphics;
Thread thread;
MediaTracker mediaTracker;
boolean[] isImageReady; //图片是否已经装载
MemoryImageSource memoryimagesource;
int imageWidth, imageHeight; //图像的宽及高
int[] pixelA, pixelB;
int[] redA, greenA, blueA, redB, greenB, blueB; public effect() throws HeadlessException {
bufferImage[0] = getImage("a.jpg");
bufferImage[1] = getImage("b.jpg");
if ( (bufferImage[0].getWidth(this) != bufferImage[1].getWidth(this)) ||
(bufferImage[0].getHeight(this) != bufferImage[1].getHeight(this))) {
System.out.println("图像尺寸不一致!");
return;
} toolkit = getToolkit();
imageWidth = bufferImage[0].getWidth(this);
imageHeight = bufferImage[0].getHeight(this);
totalBlocks = imageWidth * imageHeight; //计算分解的块数
blocks = new int[totalBlocks];
pixelA = new int[totalBlocks];
pixelB = new int[totalBlocks];
redA = new int[totalBlocks];
greenA = new int[totalBlocks];
blueA = new int[totalBlocks];
redB = new int[totalBlocks];
greenB = new int[totalBlocks];
blueB = new int[totalBlocks]; GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gd = ge.getDefaultScreenDevice();
GraphicsConfiguration gc = gd.getDefaultConfiguration();
offScreenImage = gc.createCompatibleVolatileImage(imageWidth, imageHeight); //创建图像缓冲
offScreenGraphics = offScreenImage.createGraphics(); //取得缓冲的graphics对象
} public void init() {
getImagePixels(bufferImage[0], pixelA);
getImagePixels(bufferImage[1], pixelB);
for (int i = 0; i < totalBlocks; i++) {
blocks[i] = pixelA[i]; //保存图像A的像素信息
redA[i] = pixelA[i] & 0xff0000; //保存图像B的red值
greenA[i] = pixelA[i] & 0x00ff00; //保存图像B的green值
blueA[i] = pixelA[i] & 0x0000ff; //保存图像B的blue值 redB[i] = pixelB[i] & 0xff0000; //保存图像B的red值
greenB[i] = pixelB[i] & 0x00ff00; //保存图像B的green值
blueB[i] = pixelB[i] & 0x0000ff; //保存图像B的blue值
}
prepareImagePixels(); //将像素信息还原为图像
} public void run() {
//检查java版本
String javaVersion;
try {
javaVersion = System.getProperty("java.version");
}
catch (SecurityException _ex) {
javaVersion = "unk";
}
if (javaVersion.startsWith("1.0")) {
System.out.println("require java 1.1 or later version!");
return;
} try {
thread.sleep(3000l);
}
catch (InterruptedException ex1) {
} int line = 0;
Thread currentThread = Thread.currentThread(); while (line < imageHeight && thread == currentThread) {
for (int i = 0; i < imageWidth; i++) {
int offset = line * imageWidth + i;
blocks[offset] = pixelB[offset]; //与下一被注释的语句作用相同
//blocks[offset] = redB[offset] | greenB[offset] | blueB[offset];
} memoryimagesource.newPixels(); //生成新的图像
line++;
repaint(); //适当延时
try {
thread.sleep(20l);
}
catch (InterruptedException ex) {
} }
} public void paint(Graphics g) {
if (offScreenGraphics != null) { //保证在destory()时不引发异常
offScreenGraphics.drawImage(imageBuf, 0, 0, this);
g.drawImage(offScreenImage, 0, 0, this);
}
} public void start() {
if (thread == null) {
thread = new Thread(this);
thread.start();
}
} public void stop() {
thread = null;
} public final void update(Graphics g) {
paint(g);
} public void destroy() {
if (offScreenImage != null) {
offScreenImage.flush();
}
offScreenImage = null;
if (offScreenGraphics != null) {
offScreenGraphics.dispose();
}
offScreenGraphics = null;
System.gc();
} /**
* 通过给定的文件名获得图像
* @param filename 给定图像的文件名
* @return 图像
*/
Image getImage(String filename) {
URLClassLoader urlLoader = (URLClassLoader)this.getClass().getClassLoader();
URL url = null;
Image image = null;
url = urlLoader.findResource(filename);
image = Toolkit.getDefaultToolkit().getImage(url);
MediaTracker mediatracker = new MediaTracker(this);
try {
mediatracker.addImage(image, 0);
mediatracker.waitForID(0);
}
catch (InterruptedException _ex) {
image = null;
}
if (mediatracker.isErrorID(0)) {
image = null;
} return image;
} /**
* 取得给定图像的像素数组
* @param image 指定的图像
* @param pixels 保存像素信息的数组
* @return 成功返回true
*/
private boolean getImagePixels(Image image, int pixels[]) {
PixelGrabber pixelgrabber = new PixelGrabber(image, 0, 0, imageWidth,
imageHeight, pixels,
0, imageWidth);
try {
pixelgrabber.grabPixels();
}
catch (InterruptedException _ex) {
return false;
}
return true;
} /**
* 将像素数组还原为图像
*/
void prepareImagePixels() {
memoryimagesource = new MemoryImageSource(imageWidth, imageHeight,
new DirectColorModel(24, 0xff0000,
0x00ff00, 0x0000ff), blocks, 0, imageWidth);
try {
memoryimagesource.setAnimated(true);
memoryimagesource.setFullBufferUpdates(true);
imageBuf = createImage(memoryimagesource);
memoryimagesource.newPixels(); //生成新的图像
}
catch (NoSuchMethodError _ex) { }
} /**
* 取得图像的宽度
* @return 宽度
*/
public int getWidth() {
return imageWidth;
} /**
* 取得图像的高度
* @return 高度
*/
public int getHeight() {
return imageHeight;
} public static void main(String args[]) {
JFrame frame = new JFrame("Demo");
effect e = new effect();
e.init();
e.start();
frame.getContentPane().setLayout(new BorderLayout());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.getContentPane().add(e);
frame.setSize(new Dimension(e.getWidth() + 6, e.getHeight() + 20));
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Dimension frameSize = frame.getSize();
frame.setLocation( (screenSize.width - frameSize.width) / 2,
(screenSize.height - frameSize.height) / 2);
frame.show();
}}
不知这行不行,就是用两幅图片的像素来合成一张图片,然后显示,且是动态的.网上下的.