将JPEG转换为8位BMP

时间:2016-10-28 20:43:59

标签: php

我的代码转换为16位bmp;我试图找出应该更改或添加到achive 8位bmp文件但仍然没有。我只能想象应该改变$ bfOffBits

<?php
//convert jpeg to 16 bit bmp

$jpgImageFile = 'TEST.jpg';
$newFileName = 'NEW_BMP';


$imageSource = imagecreatefromjpeg($jpgImageFile);
imagebmp($imageSource,$newFileName.".bmp");


function imagebmp(&$im, $filename = "")
{
    if (!$im) return false;
    $w = imagesx($im);
    $h = imagesy($im);
    $result = '';

    if (!imageistruecolor($im)) {
        $tmp = imagecreatetruecolor($w, $h);
        imagecopy($tmp, $im, 0, 0, 0, 0, $w, $h);
        imagedestroy($im);
        $im = & $tmp;
    }

    $biBPLine = $w * 2;
    $biStride = ($biBPLine + 3) & ~3;
    $biSizeImage = $biStride * $h;
    $bfOffBits = 66;
    $bfSize = $bfOffBits + $biSizeImage;
    $result .= substr('BM', 0, 2);
    $result .=  pack ('VvvV', $bfSize, 0, 0, $bfOffBits);
    $result .= pack ('VVVvvVVVVVV', 40, $w, '-'.$h, 1, 16, 3, $biSizeImage, 0, 0, 0, 0);
    $numpad = $biStride - $biBPLine;


      $result .= pack('VVV',63488,2016,31);
      for ($y = 0; $y < $h; ++$y) {
        for ($x = 0; $x < $w; ++$x) {

            $rgb = imagecolorat($im, $x, $y);
            $r24 = ($rgb >> 16) & 0xFF;
            $g24 = ($rgb >> 8) & 0xFF;
            $b24 = $rgb & 0xFF;
            $col = ((($r24 >> 3) << 11) | (($g24 >> 2) << 5) | ($b24 >> 3));
            $result .= pack('v',$col);
        }
        for ($i = 0; $i < $numpad; ++$i)
            $result .= pack ('C', 0);
    }
    if($filename==""){
    }
    else
    {
        $file = fopen($filename, "wb");
        fwrite($file, $result);
        fclose($file);
    }
    return true;
}
?>

问题:8位看起来如何?

1 个答案:

答案 0 :(得分:0)

我希望我找到答案。我使用了imagick库,因为GD库没有响应 bmp 格式,而是使用 wbmp 来产生差异。

我的代码叫做imagick:

<?php
//convert jpeg to 8 bit bmp with imagick library

//Read the image
$im = new imagick( 'input.jpg' );

// Set number of colors
$numberColors = 256;

// Set colorspace
$colorSpace = Imagick::COLORSPACE_SRGB;

// Set tree depth
$treeDepth = 0;

// Set dither
$dither = false;

// Set quantize
$im->quantizeImage($numberColors, $colorSpace, $treeDepth, $dither, false);

// write to disk
$im->writeImage( 'output.bmp' );
?>