Java BufferedImage "Chunk" 模糊问题
Java BufferedImage "Chunk" blurring Issue
我目前正在尝试创建一个简单的(基于步骤的)关卡生成算法。到目前为止,它生产的产品我很满意,但是由于某种原因图像的像素被更改为一堆不同的灰色,即使我的代码只允许两种颜色(黑色和白色)。特别奇怪的是,像素变化只发生在图像本身周围的块中。
关于如何摆脱这种奇怪的 "blurring" 效果有什么想法吗?
图像生成代码:
package com.ryan.game.level;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Random;
public class RandomLevelGenerator
{
public BufferedImage generateLevel(int maxTiles)
{
BufferedImage levelImage = new BufferedImage(128, 128, BufferedImage.TYPE_3BYTE_BGR);
Color customColor = new Color(255, 255, 255);
int myColor = customColor.getRGB();
int xPos = 64;
int yPos = 64;
for(int i = maxTiles; i > 0; i--)
{
levelImage.setRGB(xPos, yPos, myColor); //Sets current pos to white (Floor tile)
while(true)
{
Random rand = new Random();
//=== One is up, Two is Right, Three is Down, Four is Left ===//
int direction = rand.nextInt(4) + 1; //Generates number 1-4
if (direction == 1 && yPos != 1) //Going up
{
yPos -= 1;
break;
}
if (direction == 2 && xPos != 127) //Going right
{
xPos += 1;
break;
}
if (direction == 3 && yPos != 127) //Going down
{
yPos += 1;
break;
}
if (direction == 4 && xPos != 1) //Going left
{
xPos -= 1;
break;
}
}
}
File f = new File("imageTest.jpg");
try
{
ImageIO.write(levelImage, "jpg", f);
}
catch (IOException e)
{
e.printStackTrace();
}
return levelImage;
}
}
生成的图像(每次代码为 运行 时图像都会发生变化,但始终对其有这种影响):放大图片以查看它是否很小
您正在将图像写入 JPEG,这是一种有损格式。特别是,JPEG 不太擅长表示强度的阶跃变化 - 您会在图像中得到所谓的 "ringing" 人工制品。
这是因为 JPEG 使用离散余弦变换来表示图像 - 即图像是平滑变化函数的加权和。当您使用 JPEG 拍摄自然照片时,这通常是可以接受的(或者至少不会引起注意),因为大部分图像的强度变化平滑。
将输出格式更改为无损格式;试试 PNG。
我目前正在尝试创建一个简单的(基于步骤的)关卡生成算法。到目前为止,它生产的产品我很满意,但是由于某种原因图像的像素被更改为一堆不同的灰色,即使我的代码只允许两种颜色(黑色和白色)。特别奇怪的是,像素变化只发生在图像本身周围的块中。
关于如何摆脱这种奇怪的 "blurring" 效果有什么想法吗?
图像生成代码:
package com.ryan.game.level;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Random;
public class RandomLevelGenerator
{
public BufferedImage generateLevel(int maxTiles)
{
BufferedImage levelImage = new BufferedImage(128, 128, BufferedImage.TYPE_3BYTE_BGR);
Color customColor = new Color(255, 255, 255);
int myColor = customColor.getRGB();
int xPos = 64;
int yPos = 64;
for(int i = maxTiles; i > 0; i--)
{
levelImage.setRGB(xPos, yPos, myColor); //Sets current pos to white (Floor tile)
while(true)
{
Random rand = new Random();
//=== One is up, Two is Right, Three is Down, Four is Left ===//
int direction = rand.nextInt(4) + 1; //Generates number 1-4
if (direction == 1 && yPos != 1) //Going up
{
yPos -= 1;
break;
}
if (direction == 2 && xPos != 127) //Going right
{
xPos += 1;
break;
}
if (direction == 3 && yPos != 127) //Going down
{
yPos += 1;
break;
}
if (direction == 4 && xPos != 1) //Going left
{
xPos -= 1;
break;
}
}
}
File f = new File("imageTest.jpg");
try
{
ImageIO.write(levelImage, "jpg", f);
}
catch (IOException e)
{
e.printStackTrace();
}
return levelImage;
}
}
生成的图像(每次代码为 运行 时图像都会发生变化,但始终对其有这种影响):放大图片以查看它是否很小
您正在将图像写入 JPEG,这是一种有损格式。特别是,JPEG 不太擅长表示强度的阶跃变化 - 您会在图像中得到所谓的 "ringing" 人工制品。
这是因为 JPEG 使用离散余弦变换来表示图像 - 即图像是平滑变化函数的加权和。当您使用 JPEG 拍摄自然照片时,这通常是可以接受的(或者至少不会引起注意),因为大部分图像的强度变化平滑。
将输出格式更改为无损格式;试试 PNG。