2010-08-18 48 views
0

對不起,我英文很差。我希望你能理解我的問題。 我有一個關於hadoop開發的問題。hadoop inputFile as BufferedImage

我不得不在使用hadoop的簡單圖像處理項目上訓練自己。 我想要做的就是用Hadoop旋轉圖像(當然,我不希望hadoop使用整個圖像)。 我有一個inputFormat的問題。 我該怎麼辦?

我找到了解決辦法是:

  • 把SequenceFile爲inputFormat(?但後來,我不得不做出第一的map/reduce任務,然後又使旋轉)
  • 延伸FileInputFormat和具有我開發的類的RecordReader:ImageWritable。它包含一個BufferedImage(原始圖像),一個bufferedImage [],它是我們想要的任何數字分割的圖像,以及一個int [] pixelsArray,它是圖像的「序列化」。

我不是很熟悉Java泛型太多,所以我擴展了類這樣的:

public class ImageInputFormat extends FileInputFormat< IntWritable, ImageWritable> 
public class ImageRecordReader extends RecordReader< IntWritable, ImageWritable> 

它是正確的嗎?

事實上,我是一個迷失在叢林中,甚至不知道下一步該做什麼/使用的人。我讀了很多關於hadoop的論文,但我還是不太瞭解map/reduce如何在之間運行inputfile。 有人在這裏幫我嗎?

感謝的

回答

0

我一直在尋找了兩個星期的幫助,但今天下午,我發現了一個野趣頁: http://wiki.apache.org/hadoop/HadoopMapReduce?highlight=(inputf)

因此,我探討的第二個點。現在,我可以無誤地訪問recordReader。 我看了文本代碼的源代碼。這真的幫助我。 這裏是ImageRecordReader

的一部分
final class ImageRecordReader extends RecordReader<IntWritable, ImageWritable>{ 

    ImageWritable iwri; 
    IntWritable key; 


    public ImageRecordReader(TaskAttemptContext context, FileSplit fileSplit) throws IOException, InterruptedException { 
     System.out.println(fileSplit.getPath().toString()); 
     key = new IntWritable(0); 
     iwri = new ImageWritable(4); 
    } 

    @Override 
    public void initialize(InputSplit split, TaskAttemptContext context) throws IOException, InterruptedException { 
     FileSplit fsplit = (FileSplit) split; 
     iwri.CreateImageWritableFromSerial(fsplit.getPath()); 
     iwri.affiche(); 
    } 

,這裏的主要代碼,使數據的BufferedImage變爲可以寫入:

public final class ImageWritable implements Writable{ 

    private BufferedImage bi; 
    private int[] pixelsArray; 
    private BufferedImage[] biPart; 
    private int nbPart; 

    public int[] getPixelsArray(){return pixelsArray;} 

    private void setPixelArray(){ 
     int width = bi.getWidth(); 
     int height = bi.getHeight(); 
     pixelsArray = new int[width * height +2]; 
     Image im = bi; 
     PixelGrabber pg = new PixelGrabber(im, 0, 0, width, height, pixelsArray, 2, width); 
     try{ pg.grabPixels(); } 
     catch(InterruptedException ex){ ex.printStackTrace(); } 
     pixelsArray[0] = width; 
     pixelsArray[1] = height; 
    } 
    public int[] getPixelArray(Image im){ 
     int width = im.getWidth(null); 
     int height = im.getHeight(null); 

     pixelsArray = new int[width * height +2]; 

     PixelGrabber pg = new PixelGrabber(im, 0, 0, width, height, pixelsArray, 2, width); 
     try{ pg.grabPixels(); } 
     catch(InterruptedException ex) { ex.printStackTrace(); } 

     pixelsArray[0] = width; 
     pixelsArray[1] = height; 
     System.out.println("Width = "+ width); 
     System.out.println("Heitgh = "+ height); 
     return pixelsArray; 
    } 

    private void createPartfromPixelArray(int[] pixArr){ 
     MemoryImageSource mis; 
     Toolkit tk = Toolkit.getDefaultToolkit(); 
     int wPart = pixArr[0]/(nbPart/2); 
     int hPart = pixArr[1]/2; 
     int lgLi = pixArr[0]; 
     for(int i = 1; i <= nbPart; ++i){ 
      if(i<=nbPart/2){ 
       mis = new MemoryImageSource(wPart, hPart, pixArr, 2+ i*wPart, lgLi); 
      } else { 
       mis = new MemoryImageSource(wPart, hPart, pixArr, (pixArr.length+2)/2 + (i%(nbPart/2))*wPart, lgLi); 
      } 

      biPart[i-1] = RotationToolKit.getBuffered(tk.createImage(mis)); 
      affiche(biPart[i-1], Integer.toString(i)); 
     } 

    } 

    public ImageWritable(int nbPart){ 
     this.nbPart = nbPart; 
     bi = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB); 
     biPart = new BufferedImage[this.nbPart]; 
    } 
    public boolean CreateImageWritableFromSerial(Path path){ 
     try { 
      System.out.println(path.toString()); 
      DataInput dataInput = new FileImageInputStream(new File(path.toString().substring(5))); 
      readFields(dataInput); 
      return true; 
     } catch (FileNotFoundException ex) { 
      Logger.getLogger(ImageWritable.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (IOException ex) { 
      Logger.getLogger(ImageWritable.class.getName()).log(Level.SEVERE, null, ex); 
     } 
      return false; 
    } 


    public void write(DataOutput d) throws IOException { 
     System.out.println("Width du tableau = "+ pixelsArray[0]); 
     System.out.println("Heitgh du tableau = "+ pixelsArray[1]); 
     System.out.println("length du tableau = "+ pixelsArray.length); 
     for(int o : pixelsArray){ 
      d.writeInt(o); 
     } 
     System.out.println(); 
    } 

    public void readFields(DataInput di) throws IOException { 
     int w = di.readInt(); 
     int h = di.readInt(); 
     int length = w * h; 
     System.out.println("Width lue du tableau = "+ w); 
     System.out.println("Heitgh lue du tableau = "+ h); 
     System.out.println("length calculée du tableau = "+ length); 
     pixelsArray = new int[length+2]; 
     pixelsArray[0] = w; 
     pixelsArray[1] = h; 
     for(int i = 2; i<pixelsArray.length; i++) 
      pixelsArray[i] = di.readInt(); 

     System.out.println(); 

     createPartfromPixelArray(pixelsArray); 
     bi = createfromPixelsArray(pixelsArray); 
    } 

    public ImageWritable getPart(int i){ return new ImageWritable(biPart[i]); } 
    public BufferedImage getBi() { return bi; } 
    public void setWithoutCreateNewBi(BufferedImage bi){ this.bi = bi; } 
    public void setBi(BufferedImage bi) { 
     Graphics2D g = bi.createGraphics(); 
     g.setComposite(AlphaComposite.DstIn); 
     g.drawImage(this.bi, null, null); 
     g.dispose(); 
    } 

    public int getNbPart() {return nbPart; } 
    public void setNbPart(int part) { nbPart = part; } 

} 

剩下的問題是: *我真的不知道,如果它仍然是正確的 *如何充分分割圖像,以獲得hdfs塊大小的小圖像?

感謝那些可以幫助我的人。