图像旋转时代码如下,但错误,原始图像上会出现一些黑点。我相信它是旋转代码的东西。有解决方案吗谢谢。图像尺寸为32x32像素,加载在屏幕中心(320x240)。
ExternalProcess process = ProcessService.createExternalProcess(taskContext, new ExternalProcessBuilder().*command*(Arrays.asList("**/bin/ls**")). workingDirectory(fileWorkingDir));
答案 0 :(得分:1)
初学者的错误(抱歉)。
依次获取每个源像素,将坐标转换为目标并复制像素值不正确。因为常规输入网格不会映射到规则网格,并且会出现空洞(和重叠)。
正确的方法是扫描目标图像(以便到达每个目标像素)并对坐标进行反变换以从源中获取像素值。
作为一种改进,您可以使用放置在源中的四个相邻像素并执行双线性插值,以减少混叠。
答案 1 :(得分:0)
伙计,这很奇怪,因为在这段代码中它运作正常!
下面是工作代码:
public class RendPanel extends JPanel {
private static final long serialVersionUID = 1L;
int widthe = 320;
int heighte = 240;
int ang = 0;
double x0 = 0.5 * (widthe - 1); // point to rotate about
double y0 = 0.5 * (heighte - 1); // center of image
public static BufferedImage fbuffer;
public RendPanel(int width, int height) {
fbuffer = new BufferedImage(320, 240, BufferedImage.TYPE_INT_RGB);
BufferedImage in = null;
try { in = ImageIO.read(new File("square.png")); } //32x32 square .png
catch (IOException e) { e.printStackTrace(); }
for (int i = 0; i < in.getWidth(); i++) {
for (int j = 0; j < in.getHeight(); j++) {
fbuffer.setRGB(i + (320 / 2) - 16, j + (240 / 2) - 16, in.getRGB(i, j));
}
}
setPreferredSize(new Dimension(width, height));
}
BufferedImage neww;
public void r(){
neww = new BufferedImage(320, 240, BufferedImage.TYPE_INT_RGB);
double angle = Math.toRadians(ang);
double sin = Math.sin(angle);
double cos = Math.cos(angle);
for (int x = 0; x < widthe; x++) {
for (int y = 0; y < heighte; y++) {
if(x >= x0 - 32 && x <= x0 + 32 && y >= y0 - 32 && y <= y0 + 32){
double a = x - x0;
double b = y - y0;
int xx = (int) (+a * cos - b * sin + x0);
int yy = (int) (+a * sin + b * cos + y0);
// plot pixel (x, y) the same color as (xx, yy) if it's in bounds
if (xx >= 0 && xx < widthe && yy >= 0 && yy < heighte) {
neww.setRGB(x, y, fbuffer.getRGB(xx, yy));
}
}
}
}
ang++;
repaint();
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(neww, 0, 0, null);
}
}
感谢: https://introcs.cs.princeton.edu/java/31datatype/Rotation.java.html
编辑:
您必须将bf2.setRGB(x, y, fbuffer.getRGB(xx, yy));
上的变量反转为旋转坐标。