从PHP读取java字节
我有一个通过网络发送压缩图像的JAVA应用程序。 每个像素值都转换为新的字节类型。 我的问题是,我不知道如何用PHP正确解码这些字节 以下是JAVA压缩:从PHP读取java字节,java,php,Java,Php,我有一个通过网络发送压缩图像的JAVA应用程序。 每个像素值都转换为新的字节类型。 我的问题是,我不知道如何用PHP正确解码这些字节 以下是JAVA压缩: public byte[]CompressedImage(BufferedImage img,int color\u type){ if((img.getType()!=2)和&(img.getType()!=1)){ 抛出新的RuntimeException(“不支持图像格式”); } int sizeX=img.getWidth();/
public byte[]CompressedImage(BufferedImage img,int color\u type){
if((img.getType()!=2)和&(img.getType()!=1)){
抛出新的RuntimeException(“不支持图像格式”);
}
int sizeX=img.getWidth();//640px
int sizeY=img.getHeight();//80px
矢量压缩数据=新矢量(sizeY*(1+3*sizeX)+1);
DataBuffer data=img.getRaster().getDataBuffer();
整数计数=0;
int-nextPix=0;
int-ptr=0;
对于(int y=0;y>16;
int color_G=(currPix&0xFF00)>>8;
int color_B=currPix&0xFF;
add(新字节((字节)((color\R&0xFF)>>1));
add(新字节((字节)((color_G&0xFF)>>1));
compressedData.add(新字节((字节)((color_B&0xFF)>>1));
如果(计数!=0){
add(新字节((字节)(0xFFFFFFC0 |计数));
}
计数=0;
currPix=nextPix;
}而(x++
使用WireShark软件,我已经能够捕获一个包含完整图像的数据包,并将其存储在文件“scalio.bin”中
现在我尝试用PHP读取这个scalio.bin文件,以便重新创建图像。
我知道每个-128值意味着一个新行
我知道我应该能够得到4个值:R,G,B和count
我尝试使用unpack()和sprintf()但没有真正成功:
$filename = "scalio.bin";
$handle = fopen($filename, "rb");
$content = fread($handle, filesize($filename));
/* METHOD 1 */
for ($i=0; $i<strlen($content); $i++){
$v = sprintf("%d", bin2hex($content[$i]));
if(hexdec($v) == 128) {
$line++;
} else {
$imgArray[$line][] = hexdec($v);
}
}
echo "<pre>";
print_r($imgArray);
echo "</pre>";
/* METHOD 2 */
$data = unpack("c*", $content);
foreach($data as $val){
switch($val){
case -128:
$line++;
break;
default:
$imgArray[$line][] = $val;
}
}
for($i=0; $i<sizeof($imgArray); $i++){
$imgArray[$i] = array_chunk($imgArray[$i], 4);
}
echo "<pre>";
print_r($imgArray);
echo "</pre>";
$filename=“scalio.bin”;
$handle=fopen($filename,“rb”);
$content=fread($handle,filesize($filename));
/*方法1*/
为了($i=0;$i我终于得到了它!
但是我对性能不是很满意。你知道如何优化我的代码吗
我错过了下面的Java代码,老实说,我根本看不出这是如何解码的。如果你有一个用Java或其他语言编写的工作解码器,你可能希望以此为基础,如果没有,你应该先用你最熟悉的语言编写解码器。
$filename = "scalio.bin";
$handle = fopen($filename, "rb");
$content = fread($handle, filesize($filename));
/* METHOD 1 */
for ($i=0; $i<strlen($content); $i++){
$v = sprintf("%d", bin2hex($content[$i]));
if(hexdec($v) == 128) {
$line++;
} else {
$imgArray[$line][] = hexdec($v);
}
}
echo "<pre>";
print_r($imgArray);
echo "</pre>";
/* METHOD 2 */
$data = unpack("c*", $content);
foreach($data as $val){
switch($val){
case -128:
$line++;
break;
default:
$imgArray[$line][] = $val;
}
}
for($i=0; $i<sizeof($imgArray); $i++){
$imgArray[$i] = array_chunk($imgArray[$i], 4);
}
echo "<pre>";
print_r($imgArray);
echo "</pre>";
<?php
$filename = "scalio.bin";
$handle = fopen($filename, "rb");
$content = fread($handle, filesize($filename));
$line=-1;
$imgArray=array();
$arr=array("r", "g", "b");
$color=-1;
function getNextColor(){
global $arr, $color;
if($color > 1)
$color = -1;
$color++;
return $arr[$color];
}
$pix=-1;
for ($i=0; $i<strlen($content); $i++){
$buf = bin2hex($content[$i]);
$dec = hexdec($buf);
$bytes = (($dec+128)%256) -128;
if($bytes == -128){
$line++;
$pix=-1;
}elseif($bytes < 0){
$b = substr(decbin($bytes), -8);
$imgArray[$line][$pix]['count'] = (bindec($b) ^ 0xC0) + 1;
}else{
$col = getNextColor();
$b = ($bytes & 0xFF) << 1;
if($col == "r")
$pix++;
$imgArray[$line][$pix][$col] = $b;
}
}
$sizeX = 640;
$sizeY = 80;
$gd = imagecreatetruecolor($sizeX, $sizeY);
$imgArrayTrue=array();
foreach($imgArray as $lineIndex=>$line){
foreach($line as $pixelIndex=>$pixel){
if( array_key_exists('count', $pixel) ){
for($x=0; $x<$pixel['count']; $x++){
$imgArrayTrue[$lineIndex][] = array("r"=>$pixel['r'], "g"=>$pixel['g'], "b"=>$pixel['b']);
}
}else{
$imgArrayTrue[$lineIndex][] = $pixel;
}
}
}
foreach($imgArrayTrue as $lineIndex=>$line){
foreach($line as $pixelIndex=>$pixel){
$color = imagecolorallocate($gd, $pixel['r'], $pixel['g'], $pixel['b']);
imagesetpixel($gd, $pixelIndex, $lineIndex, $color);
}
}
header('Content-Type: image/gif');
imagegif($gd);
?>