Я скачал исходник который нарисует гистограмму вав файла. Помогите убрать шум и задный фон. Вот исходник:
class.wav.php:
| Код |
<?php
/ $File: class.wave.php $Date: 09-02-08 /
class wave {
var $fp, $filesize; var $data, $blocktotal, $blockfmt, $blocksize;
function __construct($file) {
if(!$this->fp = @fopen($file, 'rb')) { return false; }
$this->filesize = filesize($file);
}
function wavechunk() {
rewind($this->fp);
$riff_fmt = 'a4ID/VSize/a4Type'; $riff_cnk = @unpack($riff_fmt, fread($this->fp, 12));
if($riff_cnk['ID'] != 'RIFF' || $riff_cnk['Type'] != 'WAVE') { return -1; }
$format_header_fmt = 'a4ID/VSize'; $format_header_cnk = @unpack($format_header_fmt, fread($this->fp, 8));
if($format_header_cnk['ID'] != 'fmt ' || !in_array($format_header_cnk['Size'], array(16, 18))) { return -2; }
$format_fmt = 'vFormatTag/vChannels/VSamplesPerSec/VAvgBytesPerSec/vBlockAlign/vBitsPerSample'.($format_header_cnk['Size'] == 18 ? '/vExtra' : ''); $format_cnk = @unpack($format_fmt, fread($this->fp, $format_header_cnk['Size']));
if($format_cnk['FormatTag'] != 1) { return -3; }
if(!in_array($format_cnk['Channels'], array(1, 2))) { return -4; }
$fact_fmt = 'a4ID/VSize/Vdata'; $fact_cnk = @unpack($fact_fmt, fread($this->fp, 12));
if($fact_cnk['ID'] != 'fact') { fseek($this->fp, ftell($this->fp) - 12); }
$data_fmt = 'a4ID/VSize'; $data_cnk = @unpack($data_fmt, fread($this->fp, 8));
if($data_cnk['ID'] != 'data') { return -5; }
if($data_cnk['Size'] % $format_cnk['BlockAlign'] != 0) { return -6; }
$this->data = fread($this->fp, $data_cnk['Size']); $this->blockfmt = $format_cnk['Channels'] == 1 ? 'sLeft' : 'sLeft/sRight';
$this->blocktotal = $data_cnk['Size'] / 4; $this->blocksize = $format_cnk['BlockAlign'];
$return = array ( 'Channels' => $format_cnk['Channels'], 'SamplesPerSec' => $format_cnk['SamplesPerSec'], 'AvgBytesPerSec' => $format_cnk['AvgBytesPerSec'], 'BlockAlign' => $format_cnk['BlockAlign'], 'BitsPerSample' => $format_cnk['BitsPerSample'], 'Extra' => $format_cnk['Extra'], 'seconds' => ($data_cnk['Size'] / $format_cnk['AvgBytesPerSec']) );
return $return;
}
function waveimage($channel = 'Left', $width = 1000, $height = 300, $bgcolor = array(255, 255, 255), $cenlinecolor = array(180, 180, 180), $imgcolor = array(0, 0, 0)) {
if(!$this->data) { if(!is_array($this->wavechunk())) { return false; } }
$width = max(10, $width); $height = max(10, $height);
$border = 1; $center = ($height - $border * 2) / 2;
$num_merge = max(1, round($this->blocktotal / $width)); $width = min($width, ceil($this->blocktotal / $num_merge));
$max = $min = 0; $x = 1;
$pixels = array(); $wavetotal = 0;
for($i = 0; $i < $this->blocktotal; $i++) { $blocks[] = @unpack($this->blockfmt, substr($this->data, $i * 4, $this->blocksize)); }
if(!isset($blocks[0][$channel])) { return false; }
for($i = 0; $i < $this->blocktotal; ) {
for($j = 0; $j < $num_merge; $j++) { if(isset($blocks[$i + $j])) { $wavetotal += $blocks[$i + $j][$channel]; } }
$y = round($wavetotal / ($j + 1)); $pixels[] = array($x, $y);
$max = max($max, $y); $min = min($min, $y);
$x++; $i += $num_merge; $wavetotal = 0;
}
$maxblock = max(abs($max), abs($min)); $zoom = $maxblock / $center;
$im = imagecreate($width, $height); $background = imagecolorallocate($im, $bgcolor[0], $bgcolor[1], $bgcolor[2]);
if($cenlinecolor) { $cenline = imagecolorallocate($im, $cenlinecolor[0], $cenlinecolor[1], $cenlinecolor[2]); imageline($im, 1, $center, $width, $center, $cenline); }
$color = imagecolorallocate($im, $imgcolor[0], $imgcolor[1], $imgcolor[2]); $y_old = 0;
foreach($pixels as $pixel) {
$y = $center - round($pixel[1] / $zoom); imagesetpixel($im, $pixel[0], $y, $color);
if($pixel[0] > 1) { imageline($im, $pixel[0] - 1, $y_old, $pixel[0], $y, $color); }
$y_old = $y;
}
return $im;
} }
?>
|
--------------------------------------------------- example_draw.php:
| Код |
<?php
if(($file = $_FILES['upload']) && $file['name'] != 'none' && $file['size'] && $file['tmp_name']) {
include 'class.wave.php';
$wave = new wave($file['tmp_name']); $chunk = $wave->wavechunk();
if(!is_array($chunk)) { exit('This is not a wav file.'); }
if($chunk['seconds'] > 999) {
echo "The wav is too long.\r\n\r\n"; print_r($chunk);
} else {
set_time_limit(999);
if($im = $wave->waveimage()) { header('Content-Type: image/png'); imagepng($im, 'simple.png');
} else { echo "wrong!\r\n\r\n"; print_r($chunk); }
} } else {
?>
<form action="?" id="upload_form" method="post" enctype="multipart/form-data"> <input type="file" name="upload" /><br /> <button type="submit">Submit Wav file</button> </form>
<?php
}
?>
|
|