该getRGB()方法返回单个int.如何将红色,绿色和蓝色单独作为0到255之间的值?
我发布这个帖子是因为我在处理Java中的图片时遇到了一些困难.我希望能够将图片转换为byte []数组,然后才能进行反向操作,这样我就可以更改每个像素的RGB,然后创建一个新图片.我想使用这个解决方案,因为BufferedImage的setRGB()和getRGB()对于巨大的图片来说可能太慢了(如果我错了,请纠正我).
我在这里阅读了一些帖子来获取byte []数组(例如这里),以便每个像素由包含红色,绿色和蓝色值的数组的3或4个单元格表示(带有额外的alpha值,当有是4个细胞),这对我来说非常有用且易于使用.这是我用来获取这个数组的代码(存储在我创建的PixelArray类中):
public PixelArray(BufferedImage image)
{
width = image.getWidth();
height = image.getHeight();
DataBuffer toArray = image.getRaster().getDataBuffer();
array = ((DataBufferByte) toArray).getData();
hasAlphaChannel = image.getAlphaRaster() != null;
}
Run Code Online (Sandbox Code Playgroud)
我的大麻烦是我没有找到任何有效的方法将此byte []数组转换为新图像,如果我想转换图片(例如,删除蓝色/绿色值并仅保留红色值).我试过这些解决方案:
1)创建一个DataBuffer对象,然后创建一个SampleModel,最后创建一个WritableRaster,然后创建BufferedImage(带有额外的ColorModel和Hashtable对象).它没有用,因为我显然没有我需要的所有信息(我不知道什么是BufferedImage()构造函数的Hashtable).
2)使用ByteArrayInputStream.这不起作用,因为ByteArrayInputStream所期望的byte []数组与我的无关:它代表文件的每个字节,而不是每个像素的每个分量(每个像素有3-4个字节)......
有人能帮助我吗?
任务: 我有一些图像,我缩小它们,并将它们连接到一个图像.但是我对实现有一点问题:
具体问题: 我想调整大小/缩放BufferedImage.getScaledInstance方法返回一个Image对象,但我无法将其强制转换为BufferedImage:
Exception in thread "main" java.lang.ClassCastException: sun.awt.image.ToolkitImage cannot be cast to java.awt.image.BufferedImage
Run Code Online (Sandbox Code Playgroud)
(我不知道为什么它是ToolkitImage而不是Image ...)
我找到了解决方案:
Image tmp = bi.getScaledInstance(SMALL_SIZE, SMALL_SIZE, BufferedImage.SCALE_FAST);
BufferedImage buffered = new BufferedImage(SMALL_SIZE,SMALL_SIZE,BufferedImage.TYPE_INT_RGB);
buffered.getGraphics().drawImage(tmp, 0, 0, null);
Run Code Online (Sandbox Code Playgroud)
但它很慢,我认为应该有更好的方法来做到这一点.
我需要BufferedImage,因为我必须让像素加入小图像.
有更好的(更好/更快)的方式吗?
编辑: 如果我首先将Image转换为ToolkitImage,它有一个getBufferedImage()方法.但它总是返回null.你知道为什么吗?
我试图获得图像每个像素的每种颜色.我的想法如下:
int[] pixels;
BufferedImage image;
image = ImageIO.read(this.getClass.getResources("image.png");
int[] pixels = ((DataBufferInt)image.getRaster().getDataBuffer()).getData();
Run Code Online (Sandbox Code Playgroud)
是对的吗?我甚至无法检查"像素"数组包含什么,因为我得到以下错误:
java.awt.image.DataBufferByte cannot be cast to java.awt.image.DataBufferInt
Run Code Online (Sandbox Code Playgroud)
我只是希望得到阵列中每个像素的颜色,我该如何实现呢?
除此之外字节通过消耗只有八个存储位作为对节约了内存的事实,32位的integer。它还有哪些实际用途?我在一篇文章中读到,当我们处理来自网络或文件的数据流时,它很有用。当您处理可能与 Java 的其他内置类型不直接兼容的原始二进制数据时,它们也很有用。任何人都可以用例子来解释这些吗?并说明一些更实际的用途?
在我的2D游戏中,我使用图形工具创建由黑色代表的漂亮,平滑的地形:

用java编写的简单算法每15个像素查找一次黑色,创建以下一组行(灰色):

正如你所看到的,有些地方的地图非常糟糕,有些地方非常好.在其他情况下,没有必要对每15个像素进行采样,例如.如果地形平坦.
使用尽可能少的点将这条曲线转换为点[线]的最佳方法是什么?每15个像素采样= 55 FPS,10个像素= 40 FPS
以下算法正在执行该任务,从右到左采样,将可粘贴输出到代码数组中:
public void loadMapFile(String path) throws IOException {
File mapFile = new File(path);
image = ImageIO.read(mapFile);
boolean black;
System.out.print("{ ");
int[] lastPoint = {0, 0};
for (int x = image.getWidth()-1; x >= 0; x -= 15) {
for (int y = 0; y < image.getHeight(); y++) {
black = image.getRGB(x, y) == -16777216 ? true : false;
if (black) {
lastPoint[0] = x;
lastPoint[1] = y;
System.out.print("{" + (x) + ", " …Run Code Online (Sandbox Code Playgroud) 我有一些代码可以在随机位置生成粒子,并以随机方向和速度移动.
每次迭代循环,我移动所有粒子,并在我的jpanel上调用重绘.
对于1,000个粒子,我每秒大约需要20到30帧.我计划最终拥有100,000到1,000,000个粒子.
在绘画中,如果窗口的大小发生变化,我只会创建一个新的bufferedimage.我将像素绘制到bufferedimage,然后调用drawImage来显示图像.
每个粒子都是一个像素,我已经确定所有的时间都用于实际绘制像素.因此,增加粒子数将大大降低帧速率.
我尝试过g.drawline(x,y,x + 1,y),img.setRGB(x,y,color),通过调用img.getRaster()得到一个像素数组.getDataBuffer().getData() ,然后设置pixelData [y*width + x] = color.
我只是通过这些不同的绘制像素的方式在帧速率上得到一个小的差异.
这是我的问题:绘制像素的最快方法是什么?是bufferedimage甚至是走的路吗?
谢谢.
我有一个代码,使用以下代码将具有灰色的位图转换为黑色和白色的位图:
// scan through all pixels
for (int x = 0; x < width; ++x) {
for (int y = 0; y < height; ++y) {
// get pixel color
pixel = bitmap.getPixel(x, y);
A = Color.alpha(pixel);
R = Color.red(pixel);
G = Color.green(pixel);
B = Color.blue(pixel);
int gray = (int) (0.2989 * R + 0.5870 * G + 0.1140 * B);
// use 128 as threshold, above -> white, below -> black
if (gray > 128)
gray = 255;
else …Run Code Online (Sandbox Code Playgroud) 我希望在Java中实现一个读取图像的功能,并能够检测出红色,蓝色,绿色,黄色等阴影,作为卫星图像分析程序的一部分.因此,例如在标准卫星图像中,蓝色将是水,因此我希望程序读取多少像素是蓝色,然后它可以说x%的图像是水.
我知道通过读取每个像素的RGB值可以使用整个逻辑语句,但有更简单的方法吗?否则将有数百个if语句需要很长时间才能写入,但也需要很长时间才能执行.理想情况下ID就像这样:
if (pixelValue = red) {
redCounter++;
}
Run Code Online (Sandbox Code Playgroud)
这显然非常简单,但它可以节省必须经历每个可能的RGB组合,红色,蓝色,绿色,黄色,紫色等,这些都是某些彩色图像中存在的所有颜色.
提前致谢.
我有TIFF256 字节的调色板。在Java中我读这TIFF来BufferedImage。这BufferedImage有IndexColorModel. 当我遍历 中的像素时BufferedImage,我只能得到 RGB。我想编写方法,用于x,y从调色板中获取原始颜色索引BufferedImage(不是 RGB 颜色,只是来自TIFFs 调色板的原始索引)。我怎样才能做到这一点?
我知道我可以遍历 IndexColorModel 并检查 RBG 相等性,但是如果TIFF至少有 2 个具有相同颜色的索引(例如索引 0 - 黑色、132 - 黑色;假设像素 10x10 具有黑色[rgb=0,0,0]- 那么我不知道我应该采用哪个索引 - 它们具有相同的 RGB 值)。我也可以读取原始数据TIFF,然后计算字节数组中的像素位置,但我不想这样做 - 我想使用JAI.
有没有办法在有BufferedImage和JAI没有外部库的情况下做到这一点?
谢谢