phpimageimage-processinguploadbinary-image

How to convert image to binary string using php and file upload?


I am trying to convert image in binary data but not getting solution in php. please help

Trying to achieve something like this url. https://www.dcode.fr/binary-image

1 . upload image and convert. 2 . This will convert my image to binary 0 and 1 format. Same thing trying to do in php with simple upload form.

Any help will be appreciated.


Solution

  • There are plenty of upload image tutorials on the interwebs, so ill leave you to figure that one out.

    For converting an image to binary. You essentially loop over the image and look at each pixel then based upon its color you output a 1 or a 0.

    function img_to_bin($file, $scale = 100, $fudge = 0) {
    
        if (!is_int($scale)) {
            throw new InvalidArgumentException('Scale argument invalid expecting int, got: '.gettype($scale));
        }
    
        $info = getimagesize($file);
        $mime = $info['mime'];
    
        switch ($mime) {
            case 'image/jpeg':
                $image_create = 'imagecreatefromjpeg';
                break;
    
            case 'image/png':
                $image_create = 'imagecreatefrompng';
                break;
    
            case 'image/gif':
                $image_create = 'imagecreatefromgif';
                break;
    
            default: 
                throw new InvalidArgumentException('Unsupported image type: '.$mime);
        }
    
        $return = null;
    
        $img = $image_create($file);
        $img = imagescale($img, $scale, $scale);
    
        $width = imagesx($img);
        $height = imagesy($img);
    
        for ($y=0; $y < $height; $y++) {
            $line = [];
            for ($x=0; $x < $width; $x++) {
                // get current pixel colour
                $rgb = imagecolorat($img, $x, $y);
                $r = ($rgb >> 16) & 0xFF;
                $g = ($rgb >> 8 ) & 0xFF;
                $b = $rgb & 0xFF;
                $pixel = ($r + $g + $b)/3;
    
                // value above 0(white) is 1 
                if ($pixel > $fudge) {
                    $line[] = "1";
                } else {
                    $line[] = "0";
                }
            }
    
            $return .= implode('', $line).PHP_EOL;
        }
        return $return;
    }
    
    echo img_to_bin("./face.png", 50).PHP_EOL;
    

    So for an image like:

    enter image description here

    Will output:

    00000000000000000000000000000000000000000000000000
    00000000000000000000011111111100000000000000000000
    00000000000000000011111111111111100000000000000000
    00000000000000011111111111111111111100000000000000
    00000000000000111111111111111111111110000000000000
    00000000000011111111111111111111111111100000000000
    00000000000111111111111111111111111111110000000000
    00000000001111111111111111111111111111111000000000
    00000000011111111111111111111111111111111100000000
    00000000111111111111111111111111111111111110000000
    00000001111111111111111111111111111111111111000000
    00000011111111111111111111111111111111111111100000
    00000111111111111111111111111111111111111111110000
    00001111111111111111111111101111111111111111111000
    00001111111111100111111111000111111111111111111000
    00001111111111000111111111000111111111111111111000
    00011111111111000111111110000111111111111111111100
    00011111111111000111111110001111111111111111111100
    00011111111111101111111111011111111111111111111100
    00011111111111111111111111111111111111111111111100
    00011110011111111111111111111111111111011111111100
    00011110011111111111111111111111111111001111111100
    00001111101111111111111111111111111110011111111000
    00001111110111111111111111111111111101111111111000
    00000111111011111111111111111111111011111111110000
    00000111111100111111111111111111110111111111110000
    00000011111110011111111111111111001111111111100000
    00000011111111100111111111111110111111111111100000
    00000001111111111001111111111001111111111111000000
    00000000111111111110000000001111111111111110000000
    00000000011111111111111111111111111111111100000000
    00000000001111111111111111111111111111111000000000
    00000000000111111111111111111111111111110000000000
    00000000000011111111111111111111111111100000000000
    00000000000000111111111111111111111110000000000000
    00000000000000011111111111111111111100000000000000
    00000000000000000011111111111111100000000000000000
    00000000000000000000001111111000000000000000000000
    00000000000000000000000000000000000000000000000000