2012-07-30 176 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

相關問題