Tag: 图像

如何有效地实现java.awt.Composite?

背景:我需要能够以“禁用”外观创建图像。 通常建议的方法是将图像转换为灰度并显示灰度图像。 缺点是它只适用于图像,因此显示图形很麻烦,因为您无法立即访问处于禁用状态的图像。 现在我认为这可以使用java.awt.Composite动态完成(然后我不需要知道如何实现一个Icon来禁用它)。 似乎没有实现转换为灰度,所以我必须创建自己的…… 也就是说,我一起攻击了一个实现(它呈现了我所期望的)。 但我不确定它是否真的适用于所有情况(复合/ CompositeContext的Javadocs对于这种复杂的操作看起来非常薄)。 正如你从我的实现中看到的那样,我采用了一种迂回的方式来逐像素处理,因为似乎没有简单的方法来批量读取/写入像素,而这种格式并不是由所涉及的栅格决定的。 欢迎任何指向更广泛的文档/示例/提示的指针。 这是SSCCE – 它通过DisabledComposite渲染(彩色)GradientPaint,将渐变转换为灰度。 请注意,在现实世界中,您将无法知道通过哪些调用呈现的内容。 Gradient实际上只是一个例子(抱歉,但是人们常常没有这样做,所以这次我会明确说明)。 import java.awt.BorderLayout; import java.awt.Color; import java.awt.Composite; import java.awt.CompositeContext; import java.awt.Dimension; import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.image.ColorModel; import java.awt.image.Raster; import java.awt.image.WritableRaster; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.SwingUtilities; public class CompositeSSCE implements Runnable { static class DisabledComposite implements […]

如何在Java应用程序中显示图像

我想在我的Java应用程序中显示一个图像。 我找到了一个代码,用于从网络服务器下载图像并在jframe中显示。 我想使用标签来显示图像或其他内容。 它不应该是JFrame。 这是我的代码: Image image = null; try { URL url = new URL( “http://sofzh.miximages.com/java/image-2.jpg”); image = ImageIO.read(url); } catch (IOException e) { } // Use a label to display the image JFrame frame = new JFrame(); JLabel lblimage = new JLabel(new ImageIcon(image)); frame.getContentPane().add(lblimage, BorderLayout.CENTER); frame.setSize(300, 400); frame.setVisible(true); 有人能帮我吗?

如何确定和自动旋转图像?

我有一堆图像,其中一些图像必须旋转。 样品: 我想逆时针旋转此图像90°。 我用Google搜索知道如何旋转图像并找到许多链接和SO线程。 但是如何确定图像是否需要旋转 ? Picasa具有自动旋转function。 我想要有类似的function。 任何指针都对我很有帮助。 我找到了一个链接,但它与Android有关。

在java中选择特定类型的文件

我使用以下代码在java中选择文件: File folder = new File(“path to folder”); File[] listOfFiles = folder.listFiles(); 现在,如果我只想选择图像文件该怎么办?

是否有适当的算法来检测图形的背景颜色?

对于大学,我们已经给出了一个任务,在给定图像的情况下,我们必须识别“数字”,它们的颜色以及它们内部的“像素组”的数量。 让我解释: 上面的图像有一个图形 (在图像中可以有多个图形,但让我们暂时忘记它)。 canvas的背景颜色是0,0处的像素(在本例中为黄色) 图形的边框颜色为黑色(可以是除canvas背景颜色以外的任何颜色)。 图的背景颜色为白色(也可以与canvas的背景颜色相同)。 图形只能有一种背景颜色。 图中有两个像素组。 一个是蓝色像素池,另一个是红色池,里面有一些绿色。 如您所见,像素组像素的颜色无关紧要(它与图形的背景颜色不同)。 重要的是他们有联系(甚至是对角线)。 因此,尽管有两种不同的颜色,但无论如何这种组被认为只是一种。 如您所见,边界可以像您希望的那样不规则。 然而,它只有一种颜色。 众所周知,像素组不会触及边界。 我被告知像素组的颜色可以是除了图形背景颜色之外的任何颜色。 我假设它可以与图的边框颜色(黑色)相同。 我们已经给出了一个能够拍摄图像并将它们转换成矩阵的类(每个元素是表示像素颜色的整数)。 就是这样。 我是用Java做的。 我做了什么 迭代矩阵中的每个像素 如果我发现一个与背景颜色不同的像素,我会认为它属于图的边界。 从现在开始我将这个像素称为initialPixel 。 请注意,我提供的图像中的initialPixel是图中左上角的黑色像素。 我有目的地在那里做了一个尖锐的切口来说明它。 我现在的任务是找到图形的背景颜色(在这种情况下是白色)。 但是我找到这样的背景颜色(白色)会遇到很多麻烦。 这是我所做的最接近的方法,适用于某些情况 – 但不适用于此图像: 由于我知道边框的颜色,我可以在initialPixel的南边找到第一种不同的颜色。 听起来好像是个好主意 – 它确实有效,但它不适用于所提供的图像:在这种情况下它会返回黄色,因为initialPixel远离图形的内容。 假设我确实找到了图形的背景颜色(白色),我的下一个任务就是要意识到图中存在两个像素组。 这个似乎更容易: 由于我现在知道图形的背景颜色(白色),我可以尝试迭代图中的每个像素,如果我发现一个不属于边框并且不是图形背景的一部分,我已经可以告诉它有一个像素组。 我可以开始递归函数来找到与这样的组相关的所有像素并“标记”它们,以便在将来的迭代中我可以完全忽略这些像素。 我需要的 是的,我的问题是关于如何找到图形的背景颜色(请记住它可以与整个图像的背景颜色相同 – 现在它是黄色的,但它也可以是白色的)基于我之前描述的内容。 我不需要任何代码 – 我只是在为这样的代码思考一个合适的算法时遇到了麻烦。 边界可能有如此奇怪的不规则线条的事实正在扼杀我。 甚至更好:我一直都做错了吗? 也许我不应该那么关注那个initialPixel 。 也许一种不同的初始方法会起作用? 是否有关于此类主题的文档/示例? 我意识到有很多关于“计算机视觉”等的研究,但我对这个特定的问题找不到多少。 […]

在Java中调整jpegs大小时丢失颜色(尝试使用多个库)

我已经尝试了在SO上发布的多个图像大小调整库,以及使用getScaledInstance原始java。 虽然一切都在大部分时间都有效,但有两个jpeg图像,每当我调整它们的颜色时,颜色总会搞砸。 第一张图片: 结果: 第二张图片: 结果: 我已经尝试使用包含Scalr,Thumbnailator和raw java的多个库的这些图像,使用image.getScaledInstance() (请参阅此处查看代码),但结果是相同的。 有什么想法是什么问题?

如何通过编程将图像编码为Javavideo文件?

我试图将一些相同分辨率的图像编码成一个video文件使用,为此,我试过: jCodec jcodec ..示例说明 但这是非常耗时的,并且不是编码大量图像的适当工具,并且它创建了快速的时间扩展。 FFMPEG FFMPEG ..示例说明 但是ffmpeg只能从图像文件中创建video。 需要在物理系统上创建映像。 我听说过Xuggler ,它的API可以在java程序中用来创建video文件,但因为它的网站似乎已经坏了。 我无法尝试。 有人知道如何将java格式的图像编码成video文件请帮忙! 提前致谢 !

Java – XML中的图像编码

我以为我会相对容易地找到解决这个问题的方法,但在这里,我呼吁你们众神的帮助让我摆脱这个难题。 所以,我有一个图像,我想用Java将它存储在XML文档中。 我以前通过将图像保存到流中,将流转换为数组,然后VB的xml类能够将数组编码为base64字符串,在VisualBasic中实现了这一点。 但是,经过几个小时的网络淘网寻找Java中的等效解决方案后,我空手而归。 我唯一的成功是: import it.sauronsoftware.base64.*; import java.awt.image.BufferedImage; import org.w3c.dom.*; … BufferedImage img; Element node; … java.io.ByteArrayOutputStream os = new java.io.ByteArrayOutputStream(); ImageIO.write(img, “png”, os); byte[] array = Base64.encode(os.toByteArray()); String ss = arrayToString(array, “,”); node.setTextContent(ss); … private static String arrayToString(byte[] a, String separator) { StringBuffer result = new StringBuffer(); if (a.length > 0) { result.append(a[0]); […]

Java图像分析 – 计算垂直线

我需要一点Java的图像分析算法的帮助。 我基本上有这样的图像: 所以,正如你可能猜到的那样,我需要计算一下。 你认为哪种方法最好? 谢谢,Smaug

如何使用NIO将InputStream写入File?

我使用以下方式将InputStream写入File : private void writeToFile(InputStream stream) throws IOException { String filePath = “C:\\Test.jpg”; FileChannel outChannel = new FileOutputStream(filePath).getChannel(); ReadableByteChannel inChannel = Channels.newChannel(stream); ByteBuffer buffer = ByteBuffer.allocate(1024); while(true) { if(inChannel.read(buffer) == -1) { break; } buffer.flip(); outChannel.write(buffer); buffer.clear(); } inChannel.close(); outChannel.close(); } 我想知道这是否是使用NIO的正确方法。 我读过一个方法FileChannel.transferFrom ,它有三个参数: ReadableByteChannel src 多头头寸 长计数 在我的情况下,我只有src ,我没有position和count ,有什么方法可以使用此方法来创建文件? 另外对于Image,还有更好的方法只能从InputStream和NIO创建图像吗? 任何信息对我都非常有用。 这里有类似的问题,在SO中,但我找不到适合我的案例的特定解决方案。