2013-12-23 2 views
0

Я начинаю программировать на Java. У меня есть алгоритм, но у меня проблемы с его кодом. Я хотел бы сравнить 2 похожих изображения в позициях 2 и 4 шестнадцатеричных значений RGB-шестнадцатеричного числа, чтобы проверить, имеет ли одно из изображений разные значения пикселей, чем другие.Ошибка: программа не может найти символ для hexa2 и hexa4

Мой алгоритм логика:

  1. if(image1.substring2 == image2.substring2) && (image1.substring4 == image2.substring4) пиксели одинаковы.
  2. if(image1.substring2 != image2.substring2) || (image1.substring4 != image2.substring4), пиксели не совпадают.
  3. if(image1.substring2 != image2.substring2) && (image1.substring4 != image2.substring4), пиксели не совпадают.

У меня есть остальные коды здесь. Я попытался отделить весь процесс, поэтому мне легко решить проблему позже.

// ОСНОВНОЙ ПРОЦЕСС

public class getPixelRGB1 
    { 
private static int a; 
private static int r; 
private static int g; 
private static int b; 
private static final double bitPerColor = 4.0; 


public static void main(String[] args) throws IOException 
{ 
    FileInputStream image = null; 
    FileInputStream image2 = null; 

    getPixelData1 newPD = new getPixelData1(); 

    try { 
     BufferedImage img, img2; 

     File file = new File("img0.jpg"); 
     File file2 = new File("imgstega.jpg"); 
     image = new FileInputStream(file); 
     image2 = new FileInputStream(file2); 
     img = ImageIO.read(image); 
     img2 = ImageIO.read(image2); 

     int rowcol; 
     int width = img.getWidth(); 
     int height = img.getHeight(); 
     System.out.println("Image's Width: " + width); 
     System.out.println("Image's Height: " + height); 

     int[][] pixelData = new int[width * height][3]; 

     System.out.println("Pixel Data: " + pixelData); 

     int[] rgb; 
     int count = 0; 

     for(int i=0; i<width; i++) 
     { 
      for(int j=0; j<height; j++) 
      { 
       rgb = newPD.getPixelData(img, i, j); 

       for(int k = 0; k < rgb.length; k++) 
       { 
        pixelData[count][k] = rgb[k]; 

       } 
       count++; 
       System.out.println("\nRGB Counts: " + count); 
      } 
     } 

     int width2 = img2.getWidth(); 
     int height2 = img2.getHeight(); 
     System.out.println("Image's Width: " + width2); 
     System.out.println("Image's Height: " + height2); 

     int[][] pixelData2 = new int[width2 * height2][3]; 

     int[] rgb2; 
     int counter = 0; 

     for(int i=0; i<width2; i++) 
     { 
     for(int j=0; j<height2; j++) 
     { 
     rgb2 = newPD.getPixelData(img2, i, j); 

     for(int k = 0; k < rgb2.length; k++) 
     { 
     pixelData2[counter][k] = rgb2[k]; 

     } 
     counter++; 
     System.out.println("\nRGB2 Counts: " + counter); 
     } 
     } 

    } catch (FileNotFoundException ex) { 
     Logger.getLogger(getPixelRGB1.class.getName()).log(Level.SEVERE, null, ex); 
    } finally { 
     try { 
      image.close(); 
     } catch (IOException ex) { 
      Logger.getLogger(getPixelRGB1.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

} 
} 

// 1-ый - получить RGB пиксела значения

public class getPixelData1 
{ 
private static final double bitPerColor = 4.0; 

public int[] getPixelData(BufferedImage img, int w, int h) throws IOException 
{ 
    int argb = img.getRGB(w, h); 
    int rgb[] = new int[] 
    { 
     (argb >> 16) & 0xff, //red 
     (argb >> 8) & 0xff, //green 
     (argb  ) & 0xff //blue 
    }; 

    int red = rgb[0]; 
    int green = rgb[1]; //RGB Value in Decimal 
    int blue = rgb[2]; 

    System.out.println("\nRGBValue in Decimal --> " + "\nRed: " + red + " Green: " + green + " Blue: " + blue); 

    //Convert each channel RGB to Hexadecimal value 
    String rHex = Integer.toHexString((int)(red)); 
    String gHex = Integer.toHexString((int)(green)); 
    String bHex = Integer.toHexString((int)(blue)); 

    System.out.println("\nRGBValue in Hexa --> " + "\nRed Green Blue " + rHex + gHex + bHex); 

    //Check position 2 and 4 of hexa value for any changes 
    String hexa2, hexa4 = ""; 
    String rgbHexa = rHex + gHex + bHex; 

    hexa2 = rgbHexa.substring(1,2); 
    System.out.println("\nString RGB Hexa: " + rgbHexa); 
    System.out.println("\nSubstring at position 2: " + hexa2); 

    String hex = String.format("%02X%02X%02X", red, green, blue); 
    hexa4 = hex.substring(3,4); 
    System.out.println("\nSubstring at position 4: " + hexa4); 

    return rgb; 
} 
} 

// 2-й процесс - для сравнения значения RGB Hex обоих изображений

public class compareHexaRGB 
{ 
public int[] compareHexaRGB(BufferedImage img, BufferedImage img2, int w, int h) throws IOException 
{ 
    getPixelData1 newPD = new getPixelData1(); //get method from class getPixelData1 - is this correct? 

      if((img.hexa2.equals(img2.hexa2)) && (img.hexa4.equals(img2.hexa4))) 
       { 
        System.out.println("Pixel values at position 2 and 4 are the same."); 
       } 
      else if((img.hexa2 != img2.hexa2) || (img.hexa4 != img2.hexa4)) 
       { 
        System.out.println("Pixel values at position 2 and 4 are not the same."); 
       } 
      else if((img.hexa2 != img2.hexa2) && (img.hexa4 != img2.hexa4)) 
       { 
        System.out.println("Pixel values at position 2 and 4 are not the same."); 
       } 
} 
} 

Ошибка указала, что программа не может найти символ для hexa2 и hexa4 в bufferedImage. Может ли кто-нибудь проверить, что я сделал что-то не так с моей кодировкой здесь? Я все еще новичок в Java.

ответ

1

img имеет тип BufferedImage (javadoc). Он не содержит никаких частных (или частных) полей с именем hexa2 или hexa4.

Что вам нужно сделать, это реорганизовать ваш код, чтобы убедиться, что у вас есть к ним доступ в compareHexaRGB(). Вероятно, есть много способов сделать это. Возможно, вы можете расширить BufferedImage, чтобы включить ваши поля, или, может быть, вы могли бы просто передать их в качестве метода ввода.

Какое решение, которое было бы более изящным, трудно определить, учитывая, что у нас действительно нет всего вашего кода (например, я вообще не вижу compareHexaRGB()).

Чтобы быть более точным о проблеме компиляции: С помощью img.hexa2 для доступа к полю, вы предполагаете, что есть поле, называемое hexa2 в BufferedImage, который доступен из вашего класса. Это верно, если поле, например, объявлено как public. Как правило, поля имеют размер private и должны быть доступны при помощи геттера/сеттера. Для BufferedImage такого поля вообще нет.

Подробнее об управлении доступом here.

+0

как я должен это делать? Я действительно не понимаю эту концепцию. должен ли я создать другой метод для получения значения bufferedimage и значений hexa2 и hexa4? Я запутался – user2890264

+0

@ user2890264 Я просто объясняю вам, почему вы не можете получить доступ к 'hexa2' и' hexa4' в 'BufferedImage'. Как вы должны сделать, это совершенно другой вопрос. Вам, вероятно, придется продумать свой код и задать другой вопрос, когда вы столкнетесь с конкретной проблемой. – Magnilex

Смежные вопросы