我有一个对象,其中有许多缓冲图像,我想创建一个新的对象将所有缓冲图像复制到新对象,但这些新图像可能会被更改,我不希望通过更改原始对象图像来更改新物体图像.
明白了吗?
这可能吗,有人可以建议一个好方法吗?我已经想到了getSubImage,但是在某处读取子图像的任何更改都会被重新选回父图像.
我只是希望能够获得一个新的完全独立的BufferedImage副本或克隆
我正在寻找int[][]
从a 获取像素数据(在表单中)的最快方法BufferedImage
.我的目标是能够(x, y)
使用图像来处理图像中的像素int[x][y]
.我发现的所有方法都没有这样做(大多数都返回int[]
s).
我正在使用imgscalr Java库来调整图像大小.
resize()方法调用的结果是BufferedImage对象.我现在想把它保存为文件(通常是.jpg).
我怎样才能做到这一点?我想离开BufferedImage
- > File
但也许这不是正确的做法?
在StackOverflow上已存在类似此链接的问题,并且接受的答案是"强制转换":
Image image = ImageIO.read(new File(file));
BufferedImage buffered = (BufferedImage) image;
Run Code Online (Sandbox Code Playgroud)
在我的程序中,我尝试:
final float FACTOR = 4f;
BufferedImage img = ImageIO.read(new File("graphic.png"));
int scaleX = (int) (img.getWidth() * FACTOR);
int scaleY = (int) (img.getHeight() * FACTOR);
Image image = img.getScaledInstance(scaleX, scaleY, Image.SCALE_SMOOTH);
BufferedImage buffered = (BufferedImage) image;
Run Code Online (Sandbox Code Playgroud)
不幸的是我得到了运行时错误:
sun.awt.image.ToolkitImage无法强制转换为java.awt.image.BufferedImage
显然铸造不起作用.
问题是:将Image转换为BufferedImage的正确方法是什么(或有没有)?
我有10,000张照片需要调整大小,所以我有一个Java程序来做.不幸的是,图像的质量很差,我无法访问未压缩的图像.
import java.awt.Graphics;
import java.awt.AlphaComposite;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
/**
* This class will resize all the images in a given folder
* @author
*
*/
public class JavaImageResizer {
public static void main(String[] args) throws IOException {
File folder = new File("/Users/me/Desktop/images/");
File[] listOfFiles = folder.listFiles();
System.out.println("Total No of Files:"+listOfFiles.length);
BufferedImage img = null;
BufferedImage tempPNG = null;
BufferedImage tempJPG = null;
File newFilePNG = null;
File newFileJPG = …
Run Code Online (Sandbox Code Playgroud) 我看到很多人都有类似的问题,但是我还没有尝试找到我正在寻找的东西.
所以,我有一个读取输入图像并将其转换为字节数组的方法:
File imgPath = new File(ImageName);
BufferedImage bufferedImage = ImageIO.read(imgPath);
WritableRaster raster = bufferedImage .getRaster();
DataBufferByte data = (DataBufferByte) raster.getDataBuffer();
Run Code Online (Sandbox Code Playgroud)
我现在想要做的是将它转换回BufferedImage(我有一个我需要这个功能的应用程序).请注意,"test"是字节数组.
BufferedImage img = ImageIO.read(new ByteArrayInputStream(test));
File outputfile = new File("src/image.jpg");
ImageIO.write(img,"jpg",outputfile);
Run Code Online (Sandbox Code Playgroud)
但是,这会返回以下异常:
Exception in thread "main" java.lang.IllegalArgumentException: im == null!
Run Code Online (Sandbox Code Playgroud)
这是因为BufferedImage img为null.我认为这与以下事实有关:在我从BufferedImage到字节数组的原始转换中,信息被更改/丢失,因此数据不再被识别为jpg.
有没有人对如何解决这个问题有任何建议?非常感谢.
该getRGB()
方法返回单个int.如何将红色,绿色和蓝色单独作为0到255之间的值?
因此在a中BufferedImage
,您会收到一个整数,其中包含RGB值.到目前为止,我使用以下内容从中获取RGB值:
// rgbs is an array of integers, every single integer represents the
// RGB values combined in some way
int r = (int) ((Math.pow(256,3) + rgbs[k]) / 65536);
int g = (int) (((Math.pow(256,3) + rgbs[k]) / 256 ) % 256 );
int b = (int) ((Math.pow(256,3) + rgbs[k]) % 256);
Run Code Online (Sandbox Code Playgroud)
到目前为止,它的工作原理.
我需要做的是弄清楚如何获得一个整数,以便我可以使用BufferedImage.setRGB()
,因为它采用了它给我的相同类型的数据.
我目前正在用java编写绘图程序,旨在提供灵活而全面的功能.它起源于我最后一个项目,即我前一天晚上写的.因此,它有大量的bug,我一直在逐一处理(例如,我只能保存空的文件,我的矩形不能画正确但我的圈子会......).
这一次,我一直在尝试为我的程序添加撤消/重做功能.但是,我无法"撤消"我所做的事情.因此,我有一个想法,BufferedImage
每次mouseReleased
事件被解雇时都保存我的副本.但是,由于某些图像的分辨率为1920x1080,我认为这样效率不高:存储它们可能需要几十亿字节的内存.
为什么我不能简单地用背景颜色来绘制相同的东西以进行撤销的原因是因为我有许多不同的画笔,它们基于画笔Math.random()
,并且因为有许多不同的图层(在单个图层中).
然后,我考虑克隆Graphics
我用来绘制的对象BufferedImage
.像这样:
ArrayList<Graphics> revisions = new ArrayList<Graphics>();
@Override
public void mouseReleased(MouseEvent event) {
Graphics g = image.createGraphics();
revisions.add(g);
}
Run Code Online (Sandbox Code Playgroud)
我之前没有这样做,所以我有几个问题:
BufferedImages
?在javadocs之后,我试图扩展一个BufferedImage
没有成功的是我的代码:
BufferedImage image = MatrixToImageWriter.getBufferedImage(encoded);
Graphics2D grph = image.createGraphics();
grph.scale(2.0, 2.0);
grph.dispose();
Run Code Online (Sandbox Code Playgroud)
我无法理解为什么它不起作用,有什么帮助吗?