2016-11-21 139 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; 
    } 
} 

它输出:

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