主頁 > 後端開發 > GD庫的基本資訊,影像的旋轉、水印、縮略圖、驗證碼,以及影像類的封裝

GD庫的基本資訊,影像的旋轉、水印、縮略圖、驗證碼,以及影像類的封裝

2020-09-20 02:10:52 後端開發

GD庫檢測

<?php
phpinfo();
?>

 

 

 

GD庫安裝
• Windows 使用phpstudy

• Linux 編譯安裝 –with-gd
• Linux 編譯安裝擴展


GD庫支持的影像格式

使用 gd_info() 函式 檢測服務器支持的影像格式

 

影像資訊處理

 

 

<?php
//獲取影像詳細資訊
$image = '../image/b.png';
$info = getimagesize($image);
var_dump($info);

$string = file_get_contents($image);
$info = getimagesizefromstring($string);
var_dump($info);

//獲取影像的檔案后綴
$imageType = image_type_to_extension($info[2],false);
var_dump($imageType);//string(3) "png"
//獲取影像的mime type
$mime = image_type_to_mime_type($info[2]);
var_dump($mime);//string(9) "image/png"
//創建影像
$im = imagecreatefrompng($image);
echo sprintf('a.jpg 寬:%s,高:%s',imagesx($im),imagesy($im));//a.jpg 寬:543,高:299

//根據不同的影像type 來創建影像
switch($info[2])
{
    case 1://IMAGETYPE_GIF
        $im = imagecreatefromgif($image);
        break;
    case IMAGETYPE_JPEG:
        $im = imagecreatefromjpeg($image);
        break;
    case 3:
        $im = imagecreatefrompng($image);
        break;

    default:
        echo '影像格式不支持';
        break;

}

隨機顯示圖片

/**
 * 創建影像
 * 設定背景色
 * 輸出影像
 *
 */

//創建影像 imagecreate();
$im = imagecreatetruecolor(200,200);
$back = imagecolorallocate($im,mt_rand(200,255),mt_rand(200,255),mt_rand(200,255));
imagefill($im,0,0,$back);

//設定header mime type
header('Content-type:image/png');
imagepng($im,'../image/back.png');

//隨機輸出影像到瀏覽器中
$imageList = array(
    '../image/a.jpg',
    '../image/b.png',
    '../image/back.png'
);

$imageKey = array_rand($imageList);
$image = $imageList[$imageKey];
//獲取影像資訊
$info = getimagesize($image);

//根據影像類別不同 呼叫不同的創建影像函式
switch($info[2])
{
    case 1://IMAGETYPE_GIF
        $im = imagecreatefromgif($image);
        break;
    case IMAGETYPE_JPEG:
        $im = imagecreatefromjpeg($image);
        break;
    case 3:
        $im = imagecreatefrompng($image);
        break;

    default:
        echo '影像格式不支持';
        break;

}
//設定header mime type
$mimeType = image_type_to_mime_type($info[2]);
header('Content-Type:'.$mimeType);

//根據image type呼叫不同的影像輸出型別
switch($info[2])
{
    case 1://IMAGETYPE_GIF
        imagegif($im);
        break;
    case IMAGETYPE_JPEG:
        imagejpeg($im,null,60);
        break;
    case 3:
        imagepng($im);
        break;
}

imagedestroy($im);

影像旋轉

//旋轉影像
$im = imagecreatefrompng('../image/b.png');

$back = imagecolorallocate($im,233,230,232);
$rotate = imagerotate($im,75,$back);

header('Content-type:image/jpeg');
imagejpeg($rotate);

縮略圖(圖片放大縮小)

<?php
/**
 * 縮略圖
 *
 */

//創建原圖
$srcIm = imagecreatefromjpeg('../image/a.jpg');

$srcW = imagesx($srcIm);
$srcH = imagesy($srcIm);

$percent = 0.5;

$desW = $srcW * $percent;
$desH = $srcH * $percent;

//創建新圖
$desIm = imagecreatetruecolor($desW, $desH);

//拷貝影像并調整大小
//imagecopyresized();

//重采樣拷貝影像并調整大小
imagecopyresampled($desIm, $srcIm, 0, 0, 0, 0, $desW, $desH, $srcW, $srcH);

//生成圖
imagejpeg($desIm, "../image/a_{$desW}_{$desH}.jpg", 75);
//imagepng($desIm,"../image/a_{$desW}_{$desH}.png");

//生成的影像會自動出現在image檔案夾中,不會出現在頁面上

影像拷貝(生成水印)

$im = imagecreatefrompng('../image/b.png');

$logo = imagecreatefrompng('../image/logo.png');

//把logo圖片從x y開始寬度為w 高度為h的部分影像拷貝到im影像的x y坐標上
imagecopy($im,$logo,400,200,0,0,imagesx($logo),imagesy($logo));

//透明度拷貝
imagecopymerge($im,$logo,400,200,0,0,imagesx($logo),imagesy($logo),10);
header('Content-Type:image/png');

imagepng($im);

影像中顯示文字

//創建畫布
$im = imagecreatetruecolor(400,200);
$back = imagecolorallocate($im,mt_rand(200,250),mt_rand(200,250),mt_rand(200,250));
imagefill($im,0,0,$back);

//創建字體顏色
$stringColor = imagecolorallocate($im,mt_rand(50,150),mt_rand(50,150),mt_rand(50,150));
//影像中水平寫入字串
//imagestring只能使用系統字體
imagestring($im,5,mt_rand(20,imagesx($im)-50),mt_rand(10,imagesy($im)),'hello',$stringColor);
//垂直寫入字串
//imagestringup($im,5,mt_rand(20,imagesx($im)-50),mt_rand(10,imagesy($im)),'hello',$stringColor);

header('Content-Type:image/png');
imagepng($im);

隨機四位數驗證碼

//創建畫布
$im = imagecreatetruecolor(400,200);
$back = imagecolorallocate($im,mt_rand(200,250),mt_rand(200,250),mt_rand(200,250));
imagefill($im,0,0,$back);

//生成隨機字串
$string = 'abcdefg123456789ABCDEFGHIGK';
$str='';
for($i=0;$i<4;$i++)
{
    $str.= $string[mt_rand(0,strlen($string)-1)];
}

//影像中寫入字串
imagestring($im,5,mt_rand(20,imagesx($im)-50),mt_rand(10,imagesy($im)),$str,$stringColor);

header('Content-Type:image/png');
imagepng($im);
imagettftext()可以使用自定義字體,然鵝
使用“imagettftext()”函式時,字體路徑要寫帶盤符的絕對路徑,寫相對路徑就報錯
比如改成:
D:\phpstudy_pro\WWW\phptest\gd\font\comicz.ttf
imagettftext($im,15,mt_rand(-10,10),mt_rand(20,imagesx($im)-50),mt_rand(10,imagesy($im)),$stringColor,'./font/comicz.ttf',$str);

四色隨機驗證碼

<?php

//創建畫布
$im = imagecreatetruecolor(400,200);
$back = imagecolorallocate($im,mt_rand(200,250),mt_rand(200,250),mt_rand(200,250));
imagefill($im,0,0,$back);

//生成隨機字串
$string = 'abcdefg123456789ABCDEFGHIGK';

for($i=0;$i<4;$i++)
{
    $stringColor = imagecolorallocate($im,mt_rand(50,150),mt_rand(50,150),mt_rand(50,150));
    $str = $string[mt_rand(0,strlen($string)-1)];
    //影像中寫入字串
    imagettftext($im,15,mt_rand(-10,10),20+$i*15,100,$stringColor,'D:\phpstudy_pro\WWW\phptest\gd\font\comicz.ttf',$str);
}

header('Content-Type:image/png');
imagepng($im);

 

 

 各種圖形繪制

<?php
/**
 * 圖形繪制
 * 繪畫復雜圖形
 */

//畫布
$im = imagecreatetruecolor(400, 200);
$back = imagecolorallocate($im, mt_rand(200, 255), mt_rand(200, 255), mt_rand(200, 255));
imagefill($im, 0, 0, $back);

//畫點
$black = imagecolorallocate($im,10,10,10);
for($i=0;$i<150;$i++)
{
    imagesetpixel($im,mt_rand(10,390),mt_rand(10,190),$black);
}

//畫線
$red = imagecolorallocate($im, 10, 0, 0);
for($j = 0; $j < 3; $j++)
{
    imageline($im, mt_rand(10, 400), mt_rand(10, 200), mt_rand(10, 400), mt_rand(10, 200), $red);

}

//設定線條粗細
imagesetthickness($im,5);
imageline($im, mt_rand(10, 400), mt_rand(10, 200), mt_rand(10, 400), mt_rand(10, 200), $red);

$style = array($red,$red,$red,$red,$red,$back,$back,$back,$back,$back);

//設定劃線的風格
imagesetstyle($im,$style);

//設定劃線的風格
imageline($im,10,50,250,200,IMG_COLOR_STYLED);

//畫矩形
imagerectangle($im,50,50,150,150,$red);

//畫圓
imageellipse($im,200,100,100,100,$red);

header('Content-Type:image/jpeg');
imagejpeg($im, null, 70);

 

 

 驗證碼類的封裝

GD庫檢測檔案 GDBasic.php

<?php
/**
 * GDBasic.php
 * description GD基礎類
 */

namespace Test\Lib;


class GDBasic
{
    protected static $_check =false;

    //檢查服務器環境中gd庫
    public static function check()
    {
        //當靜態變數不為false
        if(static::$_check)
        {
            return true;
        }

        //檢查gd庫是否加載
        if(!function_exists("gd_info"))
        {
            throw new \Exception('GD is not exists');
        }

        //檢查gd庫版本
        $version = '';
        $info = gd_info();
        if(preg_match("/\\d+\\.\\d+(?:\\.\\d+)?/", $info["GD Version"], $matches))
        {
            $version = $matches[0];
        }

        //當gd庫版本小于2.0.1
        if(!version_compare($version,'2.0.1','>='))
        {
            throw new \Exception("GD requires GD version '2.0.1' or greater, you have " . $version);
        }

        self::$_check = true;
        return self::$_check;
    }
}

驗證碼類的檔案Captcha.php

<?php
/**
 * Captcha.php
 * description 驗證碼類
 */

namespace Test\Lib;

require_once 'GDBasic.php';

class Captcha extends GDBasic
{
    //影像寬度
    protected $_width = 60;
    //影像高度
    protected $_height = 25;

    //隨機串
    protected $_code = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789abcdefghjklmnpqrstuvwxyz';

    //字體檔案
    protected $_font_file = 'D:\phpstudy_pro\WWW\phptest\gd\font\comicz.ttf';

    //影像
    protected $_im;
    //驗證碼
    protected $_captcha;

    public function __construct($width = null, $height = null)
    {
        self::check();
        $this->create($width, $height);
    }

    /**
     * 創建影像
     * @param $width
     * @param $height
     */
    public function create($width, $height)
    {
        $this->_width = is_numeric($width) ? $width : $this->_width;
        $this->_height = is_numeric($height) ? $height : $this->_height;
        //創建影像
        $im = imagecreatetruecolor($this->_width, $this->_height);
        $back = imagecolorallocate($im, mt_rand(200, 255), mt_rand(200, 255), mt_rand(200, 255));
        //填充底色
        imagefill($im, 0, 0, $back);
        $this->_im = $im;
    }

    /**
     * 混亂驗證碼
     */
    public function moll()
    {
        $back = imagecolorallocate($this->_im, 0, 0, 0);
        //在影像中隨機生成50個點
        for($i = 0; $i < 50; $i++)
        {
            imagesetpixel($this->_im, mt_rand(0, $this->_width), mt_rand(0, $this->_height), $back);
        }

        imageline($this->_im, mt_rand(0, $this->_width), mt_rand(0, $this->_height), mt_rand(0, $this->_width), mt_rand(0, $this->_height), $back);

        imageline($this->_im, mt_rand(0, $this->_width), mt_rand(0, $this->_height), mt_rand(0, $this->_width), mt_rand(0, $this->_height), $back);
    }


    /**
     * 生成驗證碼隨機串
     * @param int $length 驗證碼的個數
     * @param int $fontSize 字串的字體大小
     * @return Captcha
     */
    public function string($length = 4, $fontSize = 15)
    {
        $this->moll();
        $code = $this->_code;
        $captcha = '';
        for($i = 0; $i < $length; $i++)
        {
            $string = $code[mt_rand(0, strlen($code) - 1)];
            $strColor = imagecolorallocate($this->_im, mt_rand(100, 150), mt_rand(100, 150), mt_rand(100, 150));
            imagettftext($this->_im, $fontSize, mt_rand(-10, 10), mt_rand(3, 6) + $i * (($this->_width - 10) / $length), ($this->_height / 3) * 2, $strColor, $this->_font_file, $string);
            $captcha .= $string;
        }

        $this->_captcha = $captcha;
        return $this;
    }


    /**
     * 驗證碼存入session
     */
    public function setSession()
    {
        if(!isset($_SESSION))
        {
            session_start();
        }
        $_SESSION['captcha_code'] = $this->_captcha;
    }

    /**
     * 邏輯運算子驗證碼
     * @param int $fontSize 字體大小
     * @return $this
     */
    public function logic($fontSize = 12)
    {
        $this->moll();
        $codeArray = array(1 => 1, 2, 3, 4, 5, 6, 7, 8, 9);
        $operatorArray = array('+' => '+', '-' => '-', 'x' => '*');
        list($first, $second) = array_rand($codeArray, 2);
        $operator = array_rand($operatorArray);
        $captcha = 0;
        $string = '';
        switch($operator)
        {
            case '+':
                $captcha = $first + $second;
                break;
            case '-':
                //當第一個數小于第二個數
                if($first < $second)
                {
                    list($first, $second) = array($second, $first);
                }
                $captcha = $first - $second;
                break;

            case 'x':
                $captcha = $first * $second;
                break;
        }
        //設定驗證碼類變數
        $this->_captcha = $captcha;
        //要輸出到影像中的字串
        $string = sprintf('%s%s%s=?', $first, $operator, $second);

        $strColor = imagecolorallocate($this->_im, mt_rand(100, 150), mt_rand(100, 150), mt_rand(100, 150));
        imagettftext($this->_im, $fontSize, 0, 5, ($this->_height / 3) * 2, $strColor, $this->_font_file, $string);

        return $this;
    }


    /**
     * 輸出驗證碼
     */
    public function show()
    {
        //生成session
        $this->setSession();
        header('Content-Type:image/jpeg');
        imagejpeg($this->_im);
        imagedestroy($this->_im);
    }
}

檢測GD庫演示

//檢測GD庫
$info = gd_info();
preg_match("/\\d+\\.\\d+(?:\\.\\d+)?/", $info["GD Version"], $matches);
var_dump($matches);//0 => string '2.1.0' (length=5)

6位亂數驗證碼演示

require_once './lib/Captcha.php';

$captcha = new \Test\Lib\Captcha(80,30);

$captcha->string(6,14)->show();//6位數隨機驗證碼

 

 

邏輯計算驗證碼演示

require_once './lib/Captcha.php';

$captcha = new \Test\Lib\Captcha(80,30);

$captcha->logic(12)->show();

 

 

圖片類封裝 Image.php

<?php
/**
 * Image.php
 * author: F.X
 * date: 2017
 * description 影像類
 */

namespace Test\Lib;

require_once 'GDBasic.php';

class Image extends GDBasic
{
    protected $_width;
    protected $_height;
    protected $_im;
    protected $_type;
    protected $_mime;
    protected $_real_path;

    
    public function __construct($file)
    {
        //檢查GD庫
        self::check();
        $imageInfo = $this->createImageByFile($file);
        $this->_width = $imageInfo['width'];
        $this->_height = $imageInfo['height'];
        $this->_im = $imageInfo['im'];
        $this->_type = $imageInfo['type'];
        $this->_real_path = $imageInfo['real_path'];
        $this->_mime = $imageInfo['mime'];
    }


    /**
     * 根據檔案創建影像
     * @param $file
     * @return array
     * @throws \Exception
     */
    public function createImageByFile($file)
    {
        //檢查檔案是否存在
        if(!file_exists($file))
        {
            throw new \Exception('file is not exits');
        }

        //獲取影像資訊
        $imageInfo = getimagesize($file);
        $realPath = realpath($file);
        if(!$imageInfo)
        {
            throw new \Exception('file is not image file');
        }

        switch($imageInfo[2])
        {
            case IMAGETYPE_GIF:
                $im = imagecreatefromgif($file);
                break;
            case IMAGETYPE_JPEG:
                $im = imagecreatefromjpeg($file);
                break;
            case IMAGETYPE_PNG:
                $im = imagecreatefrompng($file);
                break;
            default:
                throw  new \Exception('image file must be png,jpeg,gif');
        }

        return array(
            'width'     => $imageInfo[0],
            'height'    => $imageInfo[1],
            'type'      => $imageInfo[2],
            'mime'      => $imageInfo['mime'],
            'im'        => $im,
            'real_path' => $realPath,
        );

    }

    /**
     * 縮略圖
     * @param  int $width 縮略圖高度
     * @param  int $height 縮略圖寬度
     * @return $this
     * @throws \Exception
     */
    public function resize($width, $height)
    {
        if(!is_numeric($width) || !is_numeric($height))
        {
            throw new \Exception('image width or height must be number');
        }
        //根據傳參的寬高獲取最終影像的寬高
        $srcW = $this->_width;
        $srcH = $this->_height;

        if($width <= 0 || $height <= 0)
        {
            $desW = $srcW;//縮略圖高度
            $desH = $srcH;//縮略圖寬度
        }
        else
        {
            $srcP = $srcW / $srcH;//寬高比
            $desP = $width / $height;

            if($width > $srcW)
            {
                if($height > $srcH)
                {
                    $desW = $srcW;
                    $desH = $srcH;
                }
                else
                {
                    $desH = $height;
                    $desW = round($desH * $srcP);
                }
            }
            else
            {
                if($desP > $srcP)
                {
                    $desW = $width;
                    $desH = round($desW / $srcP);
                }
                else
                {
                    $desH = $height;
                    $desW = round($desH * $srcP);
                }
            }
        }

        //PHP版本小于5.5
        if(version_compare(PHP_VERSION, '5.5.0', '<'))
        {
            $desIm = imagecreatetruecolor($desW, $desH);
            if(imagecopyresampled($desIm, $this->_im, 0, 0, 0, 0, $desW, $desH, $srcW, $srcH))
            {
                imagedestroy($this->_im);
                $this->_im = $desIm;
                $this->_width = imagesx($this->_im);
                $this->_height = imagesy($this->_im);
            }
        }
        else
        {
            if($desIm = imagescale($this->_im, $desW, $desH))
            {
                $this->_im = $desIm;
                $this->_width = imagesx($this->_im);
                $this->_height = imagesy($this->_im);
            }

        }

        return $this;
    }


    /**
     * 根據百分比生成縮略圖
     * @param int $percent 1-100
     * @return Image
     * @throws \Exception
     */
    public function resizeByPercent($percent)
    {
        if(intval($percent) <= 0)
        {
            throw new \Exception('percent must be gt 0');
        }

        $percent = intval($percent) > 100 ? 100 : intval($percent);

        $percent = $percent / 100;

        $desW = $this->_width * $percent;
        $desH = $this->_height * $percent;
        return $this->resize($desW, $desH);
    }


    /**
     * 影像旋轉
     * @param $degree
     * @return $this
     */
    public function rotate($degree)
    {
        $degree = 360 - intval($degree);
        $back = imagecolorallocatealpha($this->_im,0,0,0,127);
        $im = imagerotate($this->_im,$degree,$back,1);
        imagesavealpha($im,true);
        imagedestroy($this->_im);
        $this->_im = $im;
        $this->_width = imagesx($this->_im);
        $this->_height = imagesy($this->_im);
        return $this;
    }


    /**
     * 生成水印
     * @param file $water 水印圖片
     * @param int $pct   透明度
     * @return $this
     */
    public function waterMask($water ='',$pct = 60 )
    {
        //根據水印影像檔案生成影像資源
        $waterInfo = $this->createImageByFile($water);
        imagecopymerge();
        //銷毀$this->_im
        $this->_im = $waterInfo['im'];
        $this->_width = imagesx($this->_im);
        $this->_height = imagesy($this->_im);
        return $this;

    }

    
    /**
     * 圖片輸出
     * @return bool
     */
    public function show()
    {
        header('Content-Type:' . $this->_mime);
        if($this->_type == 1)
        {
            imagegif($this->_im);
            return true;
        }

        if($this->_type == 2)
        {
            imagejpeg($this->_im, null, 80);
            return true;
        }

        if($this->_type == 3)
        {
            imagepng($this->_im);
            return true;
        }
    }

    /**
     * 保存影像檔案
     * @param $file
     * @param null $quality
     * @return bool
     * @throws \Exception
     */
    public function save($file, $quality = null)
    {
        //獲取保存目的檔案的擴展名
        $ext = pathinfo($file, PATHINFO_EXTENSION);
        $ext = strtolower($ext);
        if(!$ext || !in_array($ext, array('jpg', 'jpeg', 'gif', 'png')))
        {
            throw new \Exception('image save file must be jpg ,png,gif');
        }

        if($ext === 'gif')
        {
            imagegif($this->_im, $file);
            return true;
        }
        if($ext === 'jpeg' || $ext === 'jpg')
        {
            if($quality > 0)
            {
                if($quality < 1)
                {
                    $quality = 1;
                }
                if($quality > 100)
                {
                    $quality = 100;
                }

                imagejpeg($this->_im, $file, $quality);
            }
            else
            {
                imagejpeg($this->_im, $file);
            }
            return true;
        }

        if($ext === 'png')
        {
            imagepng($this->_im, $file);
            return true;
        }

    }
}

指定尺寸縮放 演示

require_once './lib/Image.php';

$image = new \Test\Lib\Image('../image/b.png');
$image->resize(400,200)->save('../image/b_400_200.png');

 

 

按比例縮放+旋轉 演示

require_once './lib/Image.php';

$image = new \Test\Lib\Image('../image/b.png');
$image->resizeByPercent(50)->rotate(1800)->show();

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/84970.html

標籤:PHP

上一篇:Spring——AOP實作

下一篇:檔案上傳和下載實體原始碼

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more