我正在创建一个执行以下操作的程序:
程序仅使用图像的红色(来自RGB)值并将它们放在如下的波形文件中:
将以下单词视为图像中的红色像素值:
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
你的想法是对的!!
这是我用来将Image转换为Sound的部分代码:
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阵列创建长一维阵列
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());
)
任何帮助将不胜感激。 我坚持了一个多月。