0

我正在创建一个执行以下操作的程序:

  1. 将图像(png)转换为声音(wav)。
  2. 播放和录制该声音。
  3. 从声音中再现图像。

该程序仅使用图像的红色(来自 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());
)

任何帮助,将不胜感激。我坚持了一个多月。

4

0 回答 0