【发布时间】:2017-12-22 03:52:56
【问题描述】:
我正在从使用媒体播放器录制时从麦克风获取的音量值列表创建波形图像。
这对于几分钟长的录音非常有用,但当录音长约一小时时,我会收到内存不足错误。
我知道这个错误来自我试图创建位图图像的代码,宽度(以像素为单位)是数组的长度,高度始终为 200 像素。
请有人帮我创建一个方法,该方法可以接收 n 长度的大型 int 值数组(从 0 到 100),并创建一个缩放的位图图像?
我知道我最好通过较小的数组块运行并从中创建一个缩放图像,然后可能以某种方式将其附加到主缩放图像上,但我正在努力。
这是我的代码:
public void generateWaveFormImage() {
try {
mBitmap = Bitmap.createBitmap(waveValues.size(), 200, Bitmap.Config.RGB_565);
canvas = new Canvas(mBitmap);
for(int i=0; i<waveValues.size(); i++) {
canvas.drawLine(i, 100, i, 100-(int)waveValues.get(i), paint);
canvas.drawLine(i, 100, i, 100 + (int) waveValues.get(i), paint);
}
Bitmap resized = Bitmap.createScaledBitmap(mBitmap, 760, 200, true);
FileManager.saveImage(mShortNameWaveImage, resized);
} catch(Exception e) {}
waveValues = new ArrayList();
}
这对于较小的记录非常有用,即当 waveValues 数组中存储了 2000 个值时。
这是抛出内存不足错误的行
mBitmap = Bitmap.createBitmap(waveValues.size(), 200, Bitmap.Config.RGB_565);
我想添加到目前为止我尝试过的内容。
假设waveValues 数组的长度为 3500。
我取前 1000 个值,创建一个 1000 x 200 的图像并将值写入该图像,然后缩小到 760 X 200 并保存。
然后我获取接下来的 1000 个值并执行相同的操作,然后将它们附加在一起,并将图像重新缩放到 760 x 200。
然后我获取接下来的 1000 个值,执行相同的操作,并附加到主图像上,重新缩放到 760,然后对最后 500 个值执行相同的操作。
这导致创建了一个错误缩放的图像,前2个图像缩放太多,第三个图像正确,最后一个图像被缩放到更大的图像,这使得波形非常奇怪和美妙。
【问题讨论】:
标签: java android arrays canvas bitmap