- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我的代码,当您选择要裁剪的区域然后按 Enter 键时,裁剪后的图像与原始所选区域的大小/图片不同。
public class DragNDrop extends JFrame implements DropTargetListener {
private static final long serialVersionUID = 1872019741456690593L;
private Graphics g;
private BufferedImage image, origiImage;
private Rectangle area;
private Rectangle currentRect;
private Rectangle rectToDraw = null;
private Image buffer;
public static void main(String args[]) {
new DragNDrop();
}
public DragNDrop() {
super("Drop Test");
setSize(300, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setDropTarget(new DropTarget(getContentPane(), this));
setVisible(true);
CaptureListener listener = new CaptureListener();
addMouseListener(listener);
addMouseMotionListener(listener);
}
public void drop(DropTargetDropEvent dtde) {
try {
Transferable tr = dtde.getTransferable();
DataFlavor[] flavors = tr.getTransferDataFlavors();
dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
Object list = tr.getTransferData(flavors[0]);
list = list.toString().substring(1, list.toString().length()-1);
if (isValidImage(list)) {
Image droppedImage = Toolkit.getDefaultToolkit().getImage(list.toString());
image = toBufferedImage(droppedImage);
origiImage = toBufferedImage(droppedImage);
area = new Rectangle(image.getWidth(), image.getHeight());
if (droppedImage != null) {
setSize(image.getWidth(), image.getHeight());
dtde.dropComplete(true);
addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
if (e.getKeyCode() == 10) {
capture();
}
}
@Override
public void keyPressed(KeyEvent e) {
}
});
return;
}
}
dtde.rejectDrop();
} catch (Exception e) {
dtde.rejectDrop();
}
}
public void paint() {
if (area != null && image != null) {
g.clearRect(area.x, area.y, area.width, area.height);
g.drawImage(image, 0, 0, null);
}
if (currentRect != null) {
g.setColor(Color.RED);
g.drawRect(rectToDraw.x, rectToDraw.y, rectToDraw.width, rectToDraw.height);
g.setColor(new Color(255,255,255,150));
g.fillRect(rectToDraw.x, rectToDraw.y, rectToDraw.width, rectToDraw.height);
}
}
@Override
public void paint(Graphics gr) {
if (buffer == null && area != null) {
this.buffer = createImage(area.width, area.height);
this.g = buffer.getGraphics();
}
paint();
if (buffer != null)
gr.drawImage(buffer, 0, 0, this);
}
public boolean isValidImage(Object list) {
System.out.println(list.toString());
for (String string : ImageIO.getReaderFormatNames())
if (list.toString().contains(string))
return true;
return false;
}
public BufferedImage toBufferedImage(Image image) {
if (image instanceof BufferedImage) {
return (BufferedImage) image;
}
image = new ImageIcon(image).getImage();
boolean hasAlpha = hasAlpha(image);
BufferedImage bimage = null;
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
int transparency = Transparency.OPAQUE;
if (hasAlpha == true) {
transparency = Transparency.BITMASK;
}
GraphicsDevice gs = ge.getDefaultScreenDevice();
GraphicsConfiguration gc = gs.getDefaultConfiguration();
bimage = gc.createCompatibleImage(image.getWidth(null), image.getHeight(null), transparency);
if (bimage == null) {
int type = BufferedImage.TYPE_INT_RGB;
if (hasAlpha == true) {
type = BufferedImage.TYPE_INT_ARGB;
}
bimage = new BufferedImage(image.getWidth(null), image.getHeight(null), type);
}
Graphics g = bimage.createGraphics();
g.drawImage(image, 0, 0, null);
g.dispose();
return bimage;
}
public static boolean hasAlpha(Image image) {
if (image instanceof BufferedImage) {
return ((BufferedImage) image).getColorModel().hasAlpha();
}
PixelGrabber pg = new PixelGrabber(image, 0, 0, 1, 1, false);
try {
pg.grabPixels();
} catch (InterruptedException e) {
}
return pg.getColorModel().hasAlpha();
}
private void updateRectangle(int compWidth, int compHeight) {
int x = currentRect.x;
int y = currentRect.y;
int width = currentRect.width;
int height = currentRect.height;
if (width < 0) {
width = 0 - width;
x = x - width + 1;
if (x < 0) {
width += x;
x = 0;
}
}
if (height < 0) {
height = 0 - height;
y = y - height + 1;
if (y < 0) {
height += y;
y = 0;
}
}
if ((x + width) > compWidth) {
width = compWidth - x;
}
if ((y + height) > compHeight) {
height = compHeight - y;
}
if (rectToDraw != null) {
rectToDraw.setBounds(x, y, width, height);
} else {
rectToDraw = new Rectangle(x, y, width, height);
}
}
public void capture() {
BufferedImage croppedImage = origiImage.getSubimage(rectToDraw.x, rectToDraw.y, rectToDraw.width, rectToDraw.height);
setSize(rectToDraw.width, rectToDraw.height);
image = croppedImage;
}
public void upload(BufferedImage image) {
String IMGUR_POST_URI = "http://api.imgur.com/2/upload.xml";
String IMGUR_API_KEY = "b84e430b4a65d16a6955358141f21a61";
String readLine = null;
try {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ImageIO.write(image, "png", outputStream);
URL url = new URL(IMGUR_POST_URI);
String data = URLEncoder.encode("image", "UTF-8") + "=" + URLEncoder.encode(Base64.encodeBase64String(outputStream.toByteArray()).toString(), "UTF-8") + "&" + URLEncoder.encode("key", "UTF-8") + "=" + URLEncoder.encode(IMGUR_API_KEY, "UTF-8");
URLConnection urlConnection = url.openConnection();
urlConnection.setDoOutput(true);
OutputStreamWriter wr = new OutputStreamWriter(urlConnection.getOutputStream());
wr.write(data);
wr.flush();
// Get the response
InputStream inputStream;
if (((HttpURLConnection) urlConnection).getResponseCode() == 400) {
inputStream = ((HttpURLConnection) urlConnection).getErrorStream();
} else {
inputStream = urlConnection.getInputStream();
}
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String line;
while ((line = reader.readLine()) != null) {
readLine = line;
}
wr.close();
reader.close();
} catch(Exception e){
e.printStackTrace();
}
//Prints the url link of the image uploaded
System.out.println(readLine.substring(readLine.indexOf("<original>") + 10, readLine.indexOf("</original>")));
}
public void dragEnter(DropTargetDragEvent dtde) {
}
public void dragExit(DropTargetEvent dte) {
}
public void dragOver(DropTargetDragEvent dtde) {
}
public void dropActionChanged(DropTargetDragEvent dtde) {
}
private class CaptureListener extends MouseInputAdapter {
public void mouseDragged(MouseEvent e) {
updateSize(e);
}
public void mousePressed(MouseEvent e) {
int x = e.getX();
int y = e.getY();
currentRect = new Rectangle(x, y, 0, 0);
updateRectangle(getWidth(), getHeight());
repaint();
}
public void mouseReleased(MouseEvent e) {
updateSize(e);
}
public void updateSize(MouseEvent e) {
currentRect.setSize(e.getX() - currentRect.x, e.getY() - currentRect.y);
updateRectangle(getWidth(), getHeight());
repaint();
}
}
}
有人可以查看我的代码并找出为什么它没有裁剪完全相同的尺寸吗?
最佳答案
您的裁剪逻辑没有任何问题,问题在于您的绘画逻辑。
首先,您永远不应该(好吧,后面)重写顶级容器(例如 JFrame
)上的 paint
。原因有很多,而您只是发现了其中之一。
其次,您应该始终调用 super.paintXxx(g)
,不这样做确实是个坏主意。
说实话,我不知道这段代码的一半试图做什么(除了双缓冲),如果您使用像 JPanel
这样的东西,就不需要这样做了
public void paint() {
if (area != null && image != null) {
g.clearRect(area.x, area.y, area.width, area.height);
g.drawImage(image, 0, 0, null);
}
if (currentRect != null) {
g.setColor(Color.RED);
g.drawRect(rectToDraw.x, rectToDraw.y, rectToDraw.width, rectToDraw.height);
g.setColor(new Color(255,255,255,150));
g.fillRect(rectToDraw.x, rectToDraw.y, rectToDraw.width, rectToDraw.height);
}
}
@Override
public void paint(Graphics gr) {
if (buffer == null && area != null) {
this.buffer = createImage(area.width, area.height);
this.g = buffer.getGraphics();
}
paint();
if (buffer != null)
gr.drawImage(buffer, 0, 0, this);
}
这并没有考虑到框架实际上为框架装饰留下了空间(0x0实际上是窗口的左上角,而不是内部绘图表面)...
所以我接受了你的代码并重写了它......
public class DragNDrop extends JFrame {
private static final long serialVersionUID = 1872019741456690593L;
public static void main(String args[]) {
new DragNDrop();
}
public DragNDrop() {
super("Drop Test");
setLayout(new BorderLayout());
add(new ImagePane());
setSize(300, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
protected class ImagePane extends JPanel implements DropTargetListener {
private BufferedImage image, origiImage;
private Rectangle currentRect;
private Rectangle rectToDraw = null;
public ImagePane() {
setDropTarget(new DropTarget(getContentPane(), this));
CaptureListener listener = new CaptureListener();
addMouseListener(listener);
addMouseMotionListener(listener);
setFocusable(true);
requestFocusInWindow();
// Keybindings are better the KeyListeners, as the generally work...
InputMap im = getInputMap(WHEN_FOCUSED);
ActionMap am = getActionMap();
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "Capture");
am.put("Capture", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
capture();
}
});
}
@Override
protected void paintComponent(Graphics g) {
// Look how simple this is...
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
if (image != null) {
g2d.drawImage(image, 0, 0, this);
}
if (currentRect != null) {
g2d.setColor(Color.RED);
g2d.drawRect(rectToDraw.x, rectToDraw.y, rectToDraw.width, rectToDraw.height);
g2d.setColor(new Color(255, 255, 255, 150));
g2d.fillRect(rectToDraw.x, rectToDraw.y, rectToDraw.width, rectToDraw.height);
}
}
public void drop(DropTargetDropEvent dtde) {
try {
Transferable tr = dtde.getTransferable();
DataFlavor[] flavors = tr.getTransferDataFlavors();
dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
Object list = tr.getTransferData(flavors[0]);
list = list.toString().substring(1, list.toString().length() - 1);
if (isValidImage(list)) {
Image droppedImage = Toolkit.getDefaultToolkit().getImage(list.toString());
image = toBufferedImage(droppedImage);
origiImage = toBufferedImage(droppedImage);
if (droppedImage != null) {
setSize(image.getWidth(), image.getHeight());
dtde.dropComplete(true);
// This is a bad idea, apart from KeyListeners are just a bad idea,
// Each time you drop a new image, your registering a new key listener :P
// addKeyListener(new KeyListener() {
// @Override
// public void keyTyped(KeyEvent e) {
// }
//
// @Override
// public void keyReleased(KeyEvent e) {
// if (e.getKeyCode() == 10) {
// capture();
// }
// }
//
// @Override
// public void keyPressed(KeyEvent e) {
// }
// });
return;
}
}
dtde.rejectDrop();
} catch (Exception e) {
dtde.rejectDrop();
}
}
public boolean isValidImage(Object list) {
System.out.println(list.toString());
for (String string : ImageIO.getReaderFormatNames()) {
if (list.toString().contains(string)) {
return true;
}
}
return false;
}
public BufferedImage toBufferedImage(Image image) {
if (image instanceof BufferedImage) {
return (BufferedImage) image;
}
image = new ImageIcon(image).getImage();
boolean hasAlpha = hasAlpha(image);
BufferedImage bimage = null;
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
int transparency = Transparency.OPAQUE;
if (hasAlpha == true) {
transparency = Transparency.BITMASK;
}
GraphicsDevice gs = ge.getDefaultScreenDevice();
GraphicsConfiguration gc = gs.getDefaultConfiguration();
bimage = gc.createCompatibleImage(image.getWidth(null), image.getHeight(null), transparency);
if (bimage == null) {
int type = BufferedImage.TYPE_INT_RGB;
if (hasAlpha == true) {
type = BufferedImage.TYPE_INT_ARGB;
}
bimage = new BufferedImage(image.getWidth(null), image.getHeight(null), type);
}
Graphics g = bimage.createGraphics();
g.drawImage(image, 0, 0, null);
g.dispose();
return bimage;
}
public boolean hasAlpha(Image image) {
if (image instanceof BufferedImage) {
return ((BufferedImage) image).getColorModel().hasAlpha();
}
PixelGrabber pg = new PixelGrabber(image, 0, 0, 1, 1, false);
try {
pg.grabPixels();
} catch (InterruptedException e) {
}
return pg.getColorModel().hasAlpha();
}
private void updateRectangle(int compWidth, int compHeight) {
int x = currentRect.x;
int y = currentRect.y;
int width = currentRect.width;
int height = currentRect.height;
if (width < 0) {
width = 0 - width;
x = x - width + 1;
if (x < 0) {
width += x;
x = 0;
}
}
if (height < 0) {
height = 0 - height;
y = y - height + 1;
if (y < 0) {
height += y;
y = 0;
}
}
if ((x + width) > compWidth) {
width = compWidth - x;
}
if ((y + height) > compHeight) {
height = compHeight - y;
}
if (rectToDraw != null) {
rectToDraw.setBounds(x, y, width, height);
} else {
rectToDraw = new Rectangle(x, y, width, height);
}
}
public void capture() {
BufferedImage croppedImage = origiImage.getSubimage(rectToDraw.x, rectToDraw.y, rectToDraw.width, rectToDraw.height);
setSize(rectToDraw.width, rectToDraw.height);
image = croppedImage;
currentRect = null;
repaint();
}
public void upload(BufferedImage image) {
// Sorry, you can uncomment this can't you
// String IMGUR_POST_URI = "http://api.imgur.com/2/upload.xml";
// String IMGUR_API_KEY = "b84e430b4a65d16a6955358141f21a61";
// String readLine = null;
// try {
// ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
// ImageIO.write(image, "png", outputStream);
// URL url = new URL(IMGUR_POST_URI);
//
// String data = URLEncoder.encode("image", "UTF-8") + "=" + URLEncoder.encode(Base64.encodeBase64String(outputStream.toByteArray()).toString(), "UTF-8") + "&" + URLEncoder.encode("key", "UTF-8") + "=" + URLEncoder.encode(IMGUR_API_KEY, "UTF-8");
//
// URLConnection urlConnection = url.openConnection();
// urlConnection.setDoOutput(true);
// OutputStreamWriter wr = new OutputStreamWriter(urlConnection.getOutputStream());
// wr.write(data);
// wr.flush();
// // Get the response
// InputStream inputStream;
// if (((HttpURLConnection) urlConnection).getResponseCode() == 400) {
// inputStream = ((HttpURLConnection) urlConnection).getErrorStream();
// } else {
// inputStream = urlConnection.getInputStream();
// }
// BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
// String line;
// while ((line = reader.readLine()) != null) {
// readLine = line;
// }
// wr.close();
// reader.close();
// } catch (Exception e) {
// e.printStackTrace();
// }
// //Prints the url link of the image uploaded
// System.out.println(readLine.substring(readLine.indexOf("<original>") + 10, readLine.indexOf("</original>")));
}
public void dragEnter(DropTargetDragEvent dtde) {
}
public void dragExit(DropTargetEvent dte) {
}
public void dragOver(DropTargetDragEvent dtde) {
}
public void dropActionChanged(DropTargetDragEvent dtde) {
}
protected class CaptureListener extends MouseInputAdapter {
public void mouseDragged(MouseEvent e) {
updateSize(e);
}
public void mousePressed(MouseEvent e) {
requestFocusInWindow();
int x = e.getX();
int y = e.getY();
currentRect = new Rectangle(x, y, 0, 0);
updateRectangle(getWidth(), getHeight());
repaint();
}
public void mouseReleased(MouseEvent e) {
updateSize(e);
}
public void updateSize(MouseEvent e) {
if (currentRect != null) {
currentRect.setSize(e.getX() - currentRect.x, e.getY() - currentRect.y);
updateRectangle(getWidth(), getHeight());
repaint();
}
}
}
}
}
现在可以了...
关于Java 图像裁剪不准确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12486791/
我正在尝试学习 Knockout 并尝试创建一个照片 uploader 。我已成功将一些图像存储在数组中。现在我想回帖。在我的 knockout 码(Javascript)中,我这样做: 我在 Jav
我正在使用 php 编写脚本。我的典型问题是如何在 mysql 中添加一个有很多替代文本和图像的问题。想象一下有机化学中具有苯结构的描述。 最有效的方法是什么?据我所知,如果我有一个图像,我可以在数据
我在两个图像之间有一个按钮,我想将按钮居中到图像高度。有人可以帮帮我吗? Entrar
下面的代码示例可以在这里查看 - http://dev.touch-akl.com/celebtrations/ 我一直在尝试做的是在 Canvas 上绘制 2 个图像(发光,然后耀斑。这些图像的链接
请检查此https://jsfiddle.net/rhbwpn19/4/ 图像预览对于第一篇帖子工作正常,但对于其他帖子则不然。 我应该在这里改变什么? function readURL(input)
我对 Canvas 有疑问。我可以用单个图像绘制 Canvas ,但我不能用单独的图像绘制每个 Canvas 。- 如果数据只有一个图像,它工作正常,但数据有多个图像,它不工作你能帮帮我吗? va
我的问题很简单。如何获取 UIImage 的扩展类型?我只能将图像作为 UIImage 而不是它的名称。图像可以是静态的,也可以从手机图库甚至文件路径中获取。如果有人可以为此提供一点帮助,将不胜感激。
我有一个包含 67 个独立路径的 SVG 图像。 是否有任何库/教程可以为每个路径创建单独的光栅图像(例如 PNG),并可能根据路径 ID 命名它们? 最佳答案 谢谢大家。我最终使用了两个答案的组合。
我想将鼠标悬停在一张图片(音乐专辑)上,然后播放一张唱片,所以我希望它向右移动并旋转一点,当它悬停时我希望它恢复正常动画片。它已经可以向右移动,但我无法让它随之旋转。我喜欢让它尽可能简单,因为我不是编
Retina iOS 设备不显示@2X 图像,它显示 1X 图像。 我正在使用 Xcode 4.2.1 Build 4D502,该应用程序的目标是 iOS 5。 我创建了一个测试应用(主/细节)并添加
我正在尝试从头开始以 Angular 实现图像 slider ,并尝试复制 w3school基于图像 slider 。 下面我尝试用 Angular 实现,谁能指导我如何使用 Angular 实现?
我正在尝试获取图像的图像数据,其中 w= 图像宽度,h = 图像高度 for (int i = x; i imageData[pos]>0) //Taking data (here is the pr
我的网页最初通过在 javascript 中动态创建图像填充了大约 1000 个缩略图。由于权限问题,我迁移到 suPHP。现在不用标准 标签本身 我正在通过这个 php 脚本进行检索 $file
我正在尝试将 python opencv 图像转换为 QPixmap。 我按照指示显示Page Link我的代码附在下面 img = cv2.imread('test.png')[:,:,::1]/2
我试图在这个 Repository 中找出语义分割数据集的 NYU-v2 . 我很难理解图像标签是如何存储的。 例如,给定以下图像: 对应的标签图片为: 现在,如果我在 OpenCV 中打开标签图像,
import java.util.Random; class svg{ public static void main(String[] args){ String f="\"
我有一张 8x8 的图片。 (位图 - 可以更改) 我想做的是能够绘制一个形状,给定一个 Path 和 Paint 对象到我的 SurfaceView 上。 目前我所能做的就是用纯色填充形状。我怎样才
要在页面上显示图像,你需要使用源属性(src)。src 指 source 。源属性的值是图像的 URL 地址。 定义图像的语法是: 在浏览器无法载入图像时,替换文本属性告诉读者她们失去的信息。此
**MMEditing是基于PyTorch的图像&视频编辑开源工具箱,支持图像和视频超分辨率(super-resolution)、图像修复(inpainting)、图像抠图(matting)、
我正在尝试通过资源文件将图像插入到我的程序中,如下所示: green.png other files 当我尝试使用 QImage 或 QPixm
我是一名优秀的程序员,十分优秀!