// BMPファイルを読み込んでRGB値の配列のファイルを出力するプログラム。

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;

class readBMP{
	 
	 BufferedImage biImg;
	 int iWidth,iHeight;
	 int [] pixel;
	 
	 public readBMP(String fileName) {
		  
		  biImg=new BufferedImage(192,32,BufferedImage.TYPE_INT_BGR);
		  
		  pixel=new int[192*32];
		  
		  load(fileName);

		  setPixelToImage();

		  makeArray();


		  
		  
	 }
	 
	 /*public void setPanelSize(int iArg1,int iArg2) {
		  
		  iWidth=iArg1;
		  iHeight=iArg2;
		  
		  }*/
	 
	 public boolean load(String fileName) {
		  
		  int size=0,offset=0,width=0,height=0,length=0;
		  
		  File f=new File(fileName);
		  
		  size=(int)(f.length());
		  
		  if (size<1)
				return false;
		  
		  byte dat[]=new byte[size];
		  
		  try { // ファイルの内容をdatに読み込む
				
				FileInputStream fs=new FileInputStream(fileName);
				
				fs.read(dat);
				
				fs.close();
				/*for(int i=0; i<size; i++){
					 System.out.println(dat[i]);
					 }*/
		  } catch (FileNotFoundException e) {}
		  catch (IOException e) { return false; }
		  
		  // 24BitBMPでなければ戻る
		  if (dat[0]!='B' || dat[1]!='M' || dat[28]!=24)
				return false;
		  
		  offset=getInt(dat,10); // ピクセル列までのオフセット
		  
		  width=getInt(dat,18);
		  height=getInt(dat,22);
		  
		  if (width % 4==0) /* バッファの１ラインの長さを計算 */
				length=width*3;
		  else
				length=width*3+(4-(width*3) % 4);
		  
		  // ピクセル列配列取得
		  pixel=new int[width*height];
		  
		  iWidth=width;
		  iHeight=height;

		  // 24bit-32bit変換を行いながらピクセル列設定
		  for (int i=0;i<height;i++)
				for (int j=0;j<width;j++)
					 pixel[j+(height-i-1)*width]=getRGB(dat,offset+j*3+i*length);
		  
		  // BufferedImage生成
		  biImg=new BufferedImage(width,height,BufferedImage.TYPE_INT_BGR);
		  
		  setPixelToImage();
		  
		  /*setPanelSize(width,height);*/
		  
		  return true;
		  
	 }
	 
	 void setPixelToImage() {
		  
		  // BufferedImageのピクセル列設定
		  biImg.getRaster().setDataElements(0,0,iWidth,iHeight,pixel);
		  
	 }
	 
	 // 指定されたbyteを符号なし整数（0-255）のint値として返す
	 private int getByte(byte bArg) {
		  
		  if (bArg<0)
				return 256+bArg;
		  else
				return bArg;
		  
	 }
	 
	 // 指定された位置からの４バイトを正のint値として返す
	 private int getInt(byte bArg[],int iArg) {
		  
		  if (bArg[iArg+3]<0)
				return 0;
		  
		  int iNum=0,iP=1;
		  
		  for (int i=0;i<4;i++) {
				
				iNum+=getByte(bArg[iArg+i])*iP;
				iP*=256;
		  }
		  
		  return iNum;
		  
	 }
	 
	 // 指定された位置からの３バイトをint値として返す
	 private int getRGB(byte bArg[],int iArg) {
		  
		  int iNum=0,iP=1;
		  
		  for (int i=0;i<3;i++) {
				
				iNum+=getByte(bArg[iArg+(2-i)])*iP;
				iP*=256;
				
		  }
		  
		  return iNum;
		  
	 }

	 public void makeArray(){
		  
		  try{

				PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter("RGBarray.dat")));
				
				
				for(int j=0; j<iHeight; j++){
					 for(int i=0; i<iWidth; i++){
						  
						  int rgb=pixel[i+j*iWidth];
						  int[][][] rgbarr = new int[iWidth][iHeight][3];
						  
						  rgbarr[i][j][2]=(rgb >> 16) & 0xff;  //b
						  rgbarr[i][j][1]=(rgb >> 8) & 0xff;   //g
						  rgbarr[i][j][0]=rgb & 0xff;          //r
						  
						  pw.println(rgbarr[i][j][0]);
						  pw.println(rgbarr[i][j][1]);
						  pw.println(rgbarr[i][j][2]);
						  
						  System.out.println(rgbarr[i][j][2]);
					 }
				}
				pw.close();
		  }
		  catch(IOException e){
				System.out.println("入出力エラーです．");
		  }
	 }
	 public static void main(String[] args){
		  readBMP rbmp = new readBMP(args[0]);
	 }
}
