我正在尝试创建一个图像,通过将像素从旧位置复制到新坐标,为Java上的现有图像添加边框。我的解决方案正在运行,但我想知道是否有更有效/更短的方法来做到这一点。
/** Create a new image by adding a border to a specified image.
*
* @param p
* @param borderWidth number of pixels in the border
* @param borderColor color of the border.
* @return
*/
public static NewPic border(NewPic p, int borderWidth, Pixel borderColor) {
int w = p.getWidth() + (2 * borderWidth); // new width
int h = p.getHeight() + (2 * borderWidth); // new height
Pixel[][] src = p.getBitmap();
Pixel[][] tgt = new Pixel[w][h];
for (int x = 0; x < w; x++) {
for (int y = 0; y < h; y++) {
if (x < borderWidth || x >= (w - borderWidth) ||
y < borderWidth || y >= (h - borderWidth))
tgt[x][y] = borderColor;
else
tgt[x][y] = src[x - borderWidth][y - borderWidth];
}
}
return new NewPic(tgt);
}
答案 0 :(得分:2)
如果仅用于在屏幕上显示,并且目的不是为图像实际添加边框,而是使图像以边框显示在屏幕上the component that is displaying your image can be configured with a border。
component.setBorder(BorderFactory.createMatteBorder(
4, 4, 4, 4, Color.BLACK));
将呈现以黑色绘制的4个像素(在每个边缘上)。
但是,如果目的是真正重绘图像,那么我将通过抓取每个行数组,然后使用ByteBuffer并使用批量{{1}复制行数组(和边框元素)来接近它操作,然后将整个ByteBuffer的内容作为一个数组抓取回到图像中。
这是否会对性能产生任何影响尚未知,在此优化尝试之前和之后的基准测试,因为生成的代码实际上可能会更慢。
主要问题是,虽然系统Arrays函数允许批量复制和填充数组内容,但它没有提供实用程序来在目标数组上进行偏移;但是,NIO包中的缓冲区允许你很容易地做到这一点,所以如果存在一个解决方案,它就在NIO ByteBuffer或它的亲属中。