2012-07-30 179 views
0

我正在使用程序ImageResizer和XBR4x算法来将旧的2D游戏中的.gif图像高档升级到32x32到48x48。高档2D低分辨率图像

的具体步骤:

  1. 手动重命名所有图像.JPEG因为程序.gif注意:
  2. 不会开调整图像,它们是由程序作为.BMP
  3. 保存手动重命名图像再次.gif。

问题:

当在涂料中的图片看,他们看起来非常好,在我的RGB BufferedImage中绘制时,他们突然都有一个白色/灰色〜1px的边界,不是背景颜色,图像直接放在一起。因为我有这些图像的整体马赛克,白色的边界是不合格的。

图片32×32:倍增后enter image description here

图片的48x48:enter image description here

的那些地球图像带白色边框的4

游戏截图:enter image description here

问题:

如何做这些边界起源?如果不能回答这个问题,是否有更可靠的方法来升级低分辨率游戏图像,使其看起来像素化程度更低?

+1

为了更快得到更好的帮助,请发布[SSCCE](http://sscce.org) – 2012-07-30 16:16:29

+0

您是否重命名图片或转换它们?如果您在调整大小后附加问题前后有示例图片,也会很好。 – Qnan 2012-07-30 16:18:47

+0

是的,我重命名它们。 – Tom 2012-07-30 16:31:53

回答

0

我通过电子邮件发送Hawkynt,该工具的开发者,似乎错误不在工具,但微软的落实和他固定它(如多重图像调整.NET实际上更大的工具有问题)。这是他说的关于他的计划:

“当你手动输入宽度和/或高度,图像得到了由所选择的算法,其中一切正常调整

后来我使用GDI +的重采样命令,实现了微软版本的双三次调整大小算法 这个实现是有缺陷的,所以它在左右两侧产生一个像素在300像素以下的图像

我通过简单地将调整大小的图像放大一倍并将它向左移动一个像素,所以白色边框不再可见,目标图像具有预期的尺寸。“

1

我认为这是图像大小调整算法的工件,边界实际上是可见的,例如,如果您在XnView中查看它们,则会在合并之前看到放大的图像。 解决这个问题的最好方法是使用另一个工具来调整图像大小,一个允许用户控制这种边界效果的工具,但是如果您必须使用这个工具,您仍然可以通过构建一个3x3的网格来解决问题原始图像(这将是96x96),将其扩展到144x144,然后切割出中央48x48块。这将消除边界效应。

+0

你能告诉我另一个好工具吗? – Tom 2012-07-30 17:35:56

+0

对不起,不能马上建议一个,但我想你应该寻找一个最初设计用于*纹理*的工具,而不是照片或其他种类的图像。 – Qnan 2012-07-31 08:05:23

0

只是一个疯狂的猜测:原始图像是否有Alpha通道(或者当您调整大小时隐式创建一个)?当使用alpha调整图像大小时,缩放过程可能会假定图像外部的区域是透明的,并且边界像素也可能变得部分透明。

+0

原始图像不hava一个Alpha通道,但我只看到输出图像有一个。 – Tom 2012-07-30 17:33:26

1

边框是由上述工具执行的缩放程序的结果。请考虑这个演示,其中显示基于使用Image.getScaledInstance()创建的问题和缩放图像的缩放图像的图块。

请注意,如果您选择保留自己的缩放比例方法,请查看The Perils of Image.getScaledInstance()以获取更多优化解决方案。

enter image description here

import java.awt.Graphics; 
import java.awt.GraphicsEnvironment; 
import java.awt.Image; 
import java.awt.Transparency; 
import java.awt.image.BufferedImage; 
import java.net.URL; 

import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 
import javax.swing.JLabel; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 

public class TestImageScale { 

    public static void main(String[] args) { 
     try { 
      BufferedImage original = ImageIO.read(new URL(
        "http://i.stack.imgur.com/rY2i8.gif")); 
      Image scaled = original.getScaledInstance(48, 48, 
        Image.SCALE_AREA_AVERAGING); 
      BufferedImage scaledOP = ImageIO.read(new URL(
        "http://i.stack.imgur.com/Argxi.png")); 

      BufferedImage tilesOP = buildTiles(scaledOP, 3, 3); 
      BufferedImage tiles = buildTiles(scaled, 3, 3); 

      JPanel panel = new JPanel(); 
      panel.add(new JLabel(new ImageIcon(tilesOP))); 
      panel.add(new JLabel(new ImageIcon(tiles))); 

      JOptionPane.showMessageDialog(null, panel, 
        "Tiles: OP vs getScaledInstance", 
        JOptionPane.INFORMATION_MESSAGE); 
     } catch (Exception e) { 
      JOptionPane.showMessageDialog(null, e.getMessage(), "Failure", 
        JOptionPane.ERROR_MESSAGE); 
      e.printStackTrace(); 
     } 
    } 

    static BufferedImage buildTiles(Image tile, int rows, int columns) { 

     int width = tile.getWidth(null); 
     int height = tile.getHeight(null); 

     BufferedImage dest = GraphicsEnvironment 
       .getLocalGraphicsEnvironment() 
       .getDefaultScreenDevice() 
       .getDefaultConfiguration() 
       .createCompatibleImage(width * rows, height * columns, 
         Transparency.TRANSLUCENT); 
     Graphics g = dest.getGraphics(); 
     for (int row = 0; row < rows; row++) { 
      for (int col = 0; col < columns; col++) { 
       g.drawImage(tile, row * width, col * width, null); 
      } 
     } 

     g.dispose(); 

     return dest; 
    } 
} 
+0

非常感谢您为答复所作的努力。如果没有程序,我可以找到做一些升级,我会使用这种方法。但我真的很想在运行时用一个很好的算法来扩展它们。你可能知道一个,或者我应该为此提出一个新问题? – Tom 2012-07-31 09:55:29

相关问题