2016-11-21 1 views
2

기본적으로이 값은 이미지의 회색 값을 아래의 ascii 코드로 변환해야하는 프로그램의 일부입니다. "메소드는 다음과 같아야합니다. char [] []의 타입을 돌려 준다. 공백을 인쇄하는 최초의 1 개 ("return 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

음을, 방법의 반환 유형은' char [] []'. 그것은 2 차원 문자 배열입니다. 그러나 당신은'return :'과 같은 것을 쓸 수 있습니다. 이것은 합법적 인 Java 문이 아니며'return '을 사용하더라도'', 그것은 여전히 ​​char의 2 차원 배열이 아니라 단일 char입니다. – RealSkeptic

+0

2 차원 배열의 문자를 반환 할 수 있습니까? – raymondT

답변

1

먼저, char을 반환하려면 작은 따옴표로 묶어야합니다. 둘째, 실제로 문자를 반환하지 않고 문자 집합으로 설정해야합니다. 다음은 코드를 수정 한 코드입니다.

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 블록으로 퀀 타이즈 한 다음 원래 이미지로 구현하는 방법이 있습니까? 바람직하게는 제 1 코드 (비효율적 인 코드) – 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; 
    } 
} 

그것은 출력 : 모든

#:#:###:::::#:#::#:::##:#::### 
####:#::###:::#:###:##:::#::## 
##:#:##:##:::#:##::#:###:::::: 
:::#:::###:#::########:#::##:# 
:#::#:####:::#::#:::##::#:#::: 
####::####:#:::##:##::::::#### 
::####:##::#:#::::#::#:#:#::#: 
#::###::##:::####:::#:#:##::## 
#:####::::#####:#####::###:### 
::##:#:###:#:::#::####:::##:#: 
관련 문제