我正在创建一个执行以下操作的程序:
- 将图像(png)转换为声音(wav)。
- 播放和录制该声音。
- 从声音中再现图像。
该程序仅使用图像的红色(来自 RGB)值并将它们放入波形文件中,如下所示:
将以下单词视为图像中的红色像素值:
A1 A2 A3 A4
B1 B2 B3 B4
C1 C2 C3 C4 (I am using a square image)
D1 D2 D3 D4
它将它们放在波形文件中,如下所示:
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();
)
//--------------从二维数组创建长一维数组
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());
)
任何帮助,将不胜感激。我坚持了一个多月。