2016-11-21 137 views
2

因此,基本上這是程序的一部分,它應該將圖像的灰度值分別轉換爲下面的ascii代碼,但有錯誤,說「方法必須返回一個字符類型[] []「我已經成功了第一個(」返回null「)打印空白。使用grayVal轉換爲Ascii字符將圖像轉換爲Ascii代碼

public static char[][] imageToASCII(Image img) 
{ 
    BufferedImage bufImg = convert(img); 
    for(int j=0; j<bufImg.getHeight(); j++) 
    { 
    for(int i=0; i<bufImg.getWidth(); i++) 
    { 

    int values=bufImg.getRGB(i,j); 
    Color oldColor = new Color(values); 
    int red = oldColor.getRed();  // get red value 
    int green = oldColor.getGreen(); // get green value 
    int blue = oldColor.getBlue(); 
    double grayVal = 0.299*red + 0.587*green + 0.114*blue; 
    Color newColor = new Color((int)grayVal, (int)grayVal, (int)grayVal); 


    if(grayVal >= 230) 
    { 
     return null; 
    } 
    else if(grayVal >= 200 && grayVal < 230) 
    { 
     return .; 
    } 
    else if(grayVal >= 180 && grayVal < 200) 
    { 
     return *; 
    } 
    else if(grayVal >= 160 && grayVal < 180) 
    { 
     return :; 
    } 
    else if(grayVal >= 130 && grayVal < 160) 
    { 
     return o; 
    } 
    else if(grayVal >= 100 && grayVal < 130) 
    { 
     return &; 
    } 
    else if(grayVal >= 70 && grayVal < 100) 
    { 
     return 8; 
    } 
    else if(grayVal >=50 && grayVal < 70) 
    { 
     return #; 
    } 
    else 
     return @ 

    } 
    } 



}} 
+0

那麼,該方法的返回類型是'炭[] []'。這是一個二維字符數組。但是你寫了一些類似'return:'的東西,它根本不是合法的Java語句,即使你使用了'return':'',那仍然是一個char,而不是一個二維的char數組。 – RealSkeptic

+0

你能給我一個關於二維字符數組返回的例子嗎? – raymondT

回答

1

首先,要返回一個字符,你應該把它放在單引號中。其次,你實際上並不想返回一個字符,而是將它設置成一個字符矩陣。以下是對您的代碼進行的修改:

import java.awt.image.BufferedImage; 
import java.awt.Color; 

public class Test { 
    public static char[][] imageToASCII(BufferedImage img) { 
    int w = img.getWidth(); 
    int h = img.getHeight(); 
    char[][] res = new char[h][w]; 

    for(int j=0; j<h; j++) { 
     for(int i=0; i<w; i++) { 
     int values = img.getRGB(i,j); 
     Color oldColor = new Color(values); 
     int red = oldColor.getRed();  // get red value 
     int green = oldColor.getGreen(); // get green value 
     int blue = oldColor.getBlue(); 
     double grayVal = 0.299*red + 0.587*green + 0.114*blue; 

     if(grayVal >= 230) { 
      res[j][i] = ' '; 
     } else if(grayVal >= 200 && grayVal < 230) { 
      res[j][i] = '.'; 
     } else if(grayVal >= 180 && grayVal < 200) { 
      res[j][i] = '*'; 
     } else if(grayVal >= 160 && grayVal < 180) { 
      res[j][i] = ':'; 
     } else if(grayVal >= 130 && grayVal < 160) { 
      res[j][i] = 'o'; 
     } else if(grayVal >= 100 && grayVal < 130) { 
      res[j][i] = '&'; 
     } else if(grayVal >= 70 && grayVal < 100) { 
      res[j][i] = '8'; 
     } else if(grayVal >=50 && grayVal < 70) { 
      res[j][i] = '#'; 
     } else { 
      res[j][i] = '@'; 
     } 
     } 
    } 
    return res; 
    } 
} 

此外,此代碼在性能方面效率可能非常低下。對於W x H> 255的圖像,最好避免連續的if。這可以通過在初始化時創建其中通過圖像循環時將每個可能的灰度值到相應的炭,然後只解引用此陣列的陣列來完成:

import java.awt.image.BufferedImage; 
import java.awt.Color; 

public class Test { 
    private static char[] map; 

    private static void initMap() { 
    map = new char[256]; 
    int[][] ranges = new int[][] { 
     {0, 50}, {50, 70}, {70, 100}, {100, 130}, 
     {130, 160}, {160, 180}, {180, 200}, 
     {200, 230}, {230, 256} 
    }; 
    char[] v = {' ', '#', '8', '&', 'o', ':', '*', '.', ' '}; 
    for(int i=0; i<v.length; i++) { 
     for(int j=ranges[i][0]; j < ranges[i][1]; j++) { 
     map[j] = v[i]; 
     } 
    } 
    } 

    public static char[][] imageToASCII(BufferedImage img) { 
    if (map == null) { 
     initMap(); 
    } 
    int w = img.getWidth(); 
    int h = img.getHeight(); 
    char[][] res = new char[h][w]; 

    for(int j=0; j<h; j++) { 
     for(int i=0; i<w; i++) { 
     int values = img.getRGB(i,j); 
     Color oldColor = new Color(values); 
     int red = oldColor.getRed();  // get red value 
     int green = oldColor.getGreen(); // get green value 
     int blue = oldColor.getBlue(); 
     int grayVal = (int)(0.299*red + 0.587*green + 0.114*blue); 
     if (grayVal > 255) { 
      grayVal = 255; 
     } 
     res[j][i] = map[grayVal]; 
     } 
    } 
    return res; 
    } 
} 
+0

感謝您的回答,但轉換後的ASCII圖像現在比原始圖像大得多,是否有一種方法可以先將其量化爲10x10塊,然後將其實現爲原始圖像?優選使用第一代碼(低效的代碼) – raymondT

0

這裏有一個類來告訴你,你應該返回什麼結構,以及如何在控制檯顯示出來:

package stackOverflow; 

public class ImageToGrayscale 
{ 
    public static void main(String[] args) { 
     char[][] image = return2DChars(30, 10); 
     for (int i = 0; i < image.length; i++) { 
      char[] row = image[i]; 
      for (int j = 0; j < row.length; j++) { 
       System.out.print(row[j]); 
      } 
      System.out.println(); 
     } 
    } 

    public static char[][] return2DChars(int width, int height) { 
     char[][] image = new char[height][width]; 
     for (int i = 0; i < height; i++) { 
      for (int j = 0; j < width; j++) { 
       image[i][j] = (Math.random() < 0.5) ? ':' : '#'; 
      } 
     } 
     return image; 
    } 
} 

它輸出:

#:#:###:::::#:#::#:::##:#::### 
####:#::###:::#:###:##:::#::## 
##:#:##:##:::#:##::#:###:::::: 
:::#:::###:#::########:#::##:# 
:#::#:####:::#::#:::##::#:#::: 
####::####:#:::##:##::::::#### 
::####:##::#:#::::#::#:#:#::#: 
#::###::##:::####:::#:#:##::## 
#:####::::#####:#####::###:### 
::##:#:###:#:::#::####:::##:#: