私は次のことを行うプログラムを作成しています:
- 画像(png)を音声(wav)に変換します。
- そのサウンドの再生と録音。
- 音からイメージを再現する。
プログラムは画像の赤 (RGB から) の値のみを使用し、次のように wave ファイルに配置します。
次の単語を画像の赤のピクセル値と見なします。
A1 A2 A3 A4
B1 B2 B3 B4
C1 C2 C3 C4 (I am using a square image)
D1 D2 D3 D4
次のように wave ファイルに配置します。
A1 A2 A3 A4 B1 B2 B3 B4 C1 C2 C3 C4 D1 D2 D3 D4
問題は、サウンドが再生されて録音されるときです。録音の開始時間と終了時間は、プログラムによって生成されたサウンドとまったく同じである必要があります(これは決して不可能です)。そうしないと、ピクセルが次のように変位します。
XX XX A1 A2
A3 A4 B1 B2
B3 B4 C1 C2
C3 C4 D1 D2
あなたは正しいアイデアを得る!!
イメージをサウンドに変換するために使用している部分的なコードは次のとおりです。
imgBuffer = ImageIO.read(new File("D:\\Sound_To_Image.png"));
int[][][] pixels = new int[width][height][3];
LOOP
(
c = new Color(imgBuffer.getRGB(i,j));
pixels[i][j][0] = c.getRed();
)
//-------------- 2D 配列から長い 1D 配列を作成する
byte buf[]=new byte[width*height+1];
LOOP
(
buf[ptr]=(byte)(pixels[x][y][0]);
)
ByteArrayInputStream bais =new ByteArrayInputStream(buf);
AudioFormat format = new AudioFormat(20000f, 8, 1, true, false);
File file = new File("D:\\Image_To_Sound.wav");
long length = (long)(buf.length / format.getFrameSize());
AudioInputStream audioInputStreamTemp = new AudioInputStream(bais, format, length);
AudioSystem.write(audioInputStreamTemp, Type.WAVE, file);
サウンドからイメージへのコードは次のとおりです。
AudioInputStream ais=AudioSystem.getAudioInputStream(wavFile);
byte[] data=new byte[ais.available()];
ais.read(data);
//----------------正方形の画像と画像書き込みを生成するための片面
int oneSide = (int)Math.ceil(Math.sqrt((double)data.length));
int temp = data.length;
System.out.println("lnght="+data.length+"and sqr="+oneSide*oneSide);
BufferedImage img= new BufferedImage(oneSide, oneSide, BufferedImage.TYPE_INT_RGB);
LOOP
(
Color c2=new Color(Math.abs(data[ptr]),0, 0 );
img.setRGB(i, j, c2.getRGB());
)
どんな助けでも大歓迎です。これで1か月以上立ち往生しています。