标签: bufferedimage

Java:如何快速复制BufferedImage的像素?(包括单元测试)

我想从源BufferedImage到目的地复制(矩形区域)ARGB值BufferedImage.不应该进行合成:如果我复制ARGB值为0x8000BE50(alpha值为128)的像素,则目标像素必须精确为 0x8000BE50,完全覆盖目标像素.

我有一个非常精确的问题,我做了一个单元测试来展示我需要的东西.单元测试功能齐全,设备齐全,传递良好,正是我想要的.

但是,我想要一种更快,更有效的内存方法来替换copySrcIntoDstAt(...).

这就是我的问题的全部要点:我不是在追求如何以更快的方式"填充"图像(我所做的仅仅是进行单元测试的一个例子).我想要的只是知道什么是快速和内存有效的方法(即快速而不是创建不必要的对象).

我所做的概念验证实现显然非常节省内存,但速度很慢(每个像素执行一次getRGB和一次setRGB).

原理上,我有这样的:(其中A表示复制前目标图像的相应像素)

AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAA
Run Code Online (Sandbox Code Playgroud)

我希望有这个:

AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAABBBBAAA
AAAAAAAAAAAAABBBBAAA
AAAAAAAAAAAAAAAAAAAA
Run Code Online (Sandbox Code Playgroud)

其中'B'代表src图像中的像素.

请注意,我正在寻找copySrcIntoDstAt(...)方法的完全替代,而不是API链接/引用.

import org.junit.Test;

import java.awt.image.BufferedImage;

import static org.junit.Assert.*;

public class TestCopy {

    private static final int COL1 = 0x8000BE50;  // alpha at 128
    private static final int COL2 = 0x1732FE87;  // alpha at  23 

    @Test
    public void testPixelsCopy() {
        final …
Run Code Online (Sandbox Code Playgroud)

java bufferedimage

18
推荐指数
1
解决办法
1万
查看次数

获取BufferedImage的RGB

任何人都可以解释如何从BufferedImage获取rgb值数组吗?

我在BufferedImage中有一个灰度图像,需要提取一个0到255的数组来描述图像.
我知道BufferedImage是正确的,因为我可以将它保存到PNG.但是,如果我使用,int[] dataBuffInt = ((DataBufferInt) heightMap.getDataBuffer()).getData();我会得到一堆巨大的负数.

我已经搜索了一段时间,并看到了一些转移某些值的帖子(帖子),但并不真正理解他们在说什么.

基本上我想从BufferedImage转到0到25​​5 RBG值的数组.
我不确定我是否正确解释了自己,需要更多详细信息.

编辑:
@Garbage感谢您的提示.我试过int [] dataBuffInt = heightMap.getRGB(0,0,heightMap.getWidth(),heightMap.getHeight(),null,0,heightMap.getWidth()); 但得到相同的结果.
@Greg Kopff结果是2,它被设置为TYPE_INT_ARGB

java bufferedimage

18
推荐指数
1
解决办法
4万
查看次数

将BufferedImage转换为ImageIcon

如何将BufferedImage转换为ImageIcon?

我找不到任何关于此的文件.

java swing bufferedimage image-conversion imageicon

18
推荐指数
3
解决办法
5万
查看次数

将一系列BufferedImages转换为Java视频?

如何将一个BufferedImages数组转换为视频?我正在制作一台屏幕录像机.

之后如何压缩视频?

java video bufferedimage image

17
推荐指数
2
解决办法
1万
查看次数

如何序列化包含BufferedImages的对象

我正在尝试在java中创建一个简单的图像编辑程序.我创建了一个ImageCanvas对象,其中包含有关正在编辑的图像的所有信息(一些基本属性,应用的效果列表,BufferedImage图层列表等),我想要一种简单的方法将其保存到磁盘,这样就可以了稍后又开了.

我认为使用Java的defualt Serializable接口可能正是我所寻找的,我可以将整个对象写入文件,并在以后再次将其读回内存.但是,ImageCanvas包含一个ArrayList<BufferedImage>,并且BufferedImage不可序列化(其他一切都是).

我知道可以覆盖writeObject()readObject()方法,但我从来没有这样做过,我想知道是否有任何简单的方法让Java序列化其他所有内容并有一些自定义的方式来读取/写入BufferedImage磁盘?或者是否有其他方法可以轻松地将整个ImageCanvas对象写入我正在忽略的磁盘?最终我可能会实现我自己的自定义图像文件类型,但是现在我想要一种快速简便的方法来在我测试时暂时保存文件(这个ImageCanvas类会改变很多,所以我不想继续更新我的我最终确定之前的自定义文件类型).

java serialization bufferedimage image deserialization

17
推荐指数
1
解决办法
2万
查看次数

将Graphics2D转换为Image或BufferedImage

我这里有点问题.

我有一个applet,用户可以在其中"绘制".为此,我使用java.awt.Graphics2D.但是,如何将用户绘制图像保存为JPEG图像,或者至少将其转换为BufferedImage或其他什么?我不知道该怎么做.

谢谢.

java applet bufferedimage graphics2d

16
推荐指数
3
解决办法
5万
查看次数

Java BufferedImage到PNG格式的Base64字符串

我试图将屏幕截图输出作为base64编码的字符串,但没有得到很远.到目前为止,我的代码使用的是Base64库(http://iharder.sourceforge.net/current/java/base64/):

    Robot robot = new Robot();
    Rectangle r = new Rectangle( Toolkit.getDefaultToolkit().getScreenSize() );
    BufferedImage bi = robot.createScreenCapture(r);
    ByteArrayOutputStream os = new ByteArrayOutputStream();
    OutputStream b64 = new Base64.OutputStream(os);
    ImageIO.write(bi, "png", os);
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    out.writeTo(b64);
    String result = out.toString("UTF-8");
Run Code Online (Sandbox Code Playgroud)

每次我运行它,"结果"总是一个空字符串,但我不明白为什么.有任何想法吗?

注意:我不想将png写入磁盘上的文件.

java base64 png bufferedimage

16
推荐指数
3
解决办法
4万
查看次数

图像与BufferedImage

每当处理Java中的图像加载和渲染时,我以前总是使用BufferedImages来存储和操作内存中的图像.

但是,我最近遇到了一些 使用该类而不是的类型的 网站,这让我感到疑惑 - 有什么区别?ImageBufferedImage

我知道BufferedImage有一个更大/优化的工具集,但不惜任何代价?如果是这样,这个成本什么时候变得明显?在哪种情况下你会使用Imagea BufferedImage,反之亦然?

java bufferedimage image

16
推荐指数
1
解决办法
1万
查看次数

使用透明背景保存缓冲图像

我将签名图像保存为.jpg图片.我使用graphic2d在图像上绘制每个像素的签名(用签名平板电脑获得)并且它完美地工作但我总是得到白色背景.如果我想将签名放在PDF文档上,jpg图像的白色方块的边框覆盖了PDF的一些单词.

我想要的是用透明背景保存jpg图像,所以当我把它放在PDF上时,没有白色图像背景覆盖的文字,只有标记线.

这是保存缓冲图像的代码.它用白色背景做到了.

 // This method refers to the signature image to save
private RenderedImage getImage() {

    int width = tabletWidth;
    int height = tabletHeight;

    // Create a buffered image in which to draw
    BufferedImage bufferedImage = new BufferedImage(width, height,
            BufferedImage.TYPE_INT_RGB);

    // Create a graphics contents on the buffered image
    Graphics2D g2d = bufferedImage.createGraphics();

    // Draw graphics
    g2d.setColor(Color.WHITE);
    g2d.fillRect(0, 0, width, height);

    drawPoints(Tablet.getPenPoints(), g2d, Color.BLACK);

    // Graphics context no longer needed so dispose it
    g2d.dispose();

    return bufferedImage;
}
Run Code Online (Sandbox Code Playgroud)

我试图将它设置为透明但没有成功,所以我发布了这个工作部分.

java graphics bufferedimage background transparent

15
推荐指数
1
解决办法
3万
查看次数

如何将图像绘制到JPanel或JFrame?

我如何将图像绘制到JPanel或JFrame,我已经阅读了oracle的教程,但我似乎无法做到正确.我需要将图像" BeachRoad.png"显示在一组特定的坐标上.这是我到目前为止所拥有的.

public class Level1  extends JFrame implements ActionListener {

static JLayeredPane EverythingButPlayer;
static Level1 l1;

public Level1() {
    EverythingButPlayer = new JLayeredPane();

    BufferedImage img = null;
    try {
        img = ImageIO.read(new File("BeachRoad.png"));
    } catch (IOException e) {
    }
    Graphics g = img.getGraphics();
    g.drawImage(img,0, 0, EverythingButPlayer);


    this.add(EverythingButPlayer);
}
Run Code Online (Sandbox Code Playgroud)

在Main()中,

        l1 = new Level1();
    l1.setTitle("poop");
    l1.setSize(1920, 1080);
    l1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    l1.setVisible(true);
Run Code Online (Sandbox Code Playgroud)

提前致谢!

java swing bufferedimage jpanel jframe

15
推荐指数
1
解决办法
9万
查看次数