Jadual Kandungan
1. Analisis warna piksel dalam imej
2 Dapatkan warna piksel dan keluarkan warna
3 Pemetaan piksel kepada aksara
附录
完整代码
BMP文件头格式
BMP图片头格式
Rumah pembangunan bahagian belakang masalah PHP Ajar anda helah untuk menjana imej menggunakan aksara ASCII

Ajar anda helah untuk menjana imej menggunakan aksara ASCII

Jul 22, 2021 pm 03:50 PM
php

ASCII ialah sistem pengekodan komputer berdasarkan abjad Latin, terutamanya digunakan untuk memaparkan bahasa Inggeris moden dan bahasa Eropah Barat yang lain. Malah, aksara ASCII bukan sahaja boleh digunakan sebagai standard pertukaran maklumat, tetapi juga boleh digunakan untuk menjana imej Hari ini kami akan memperkenalkannya.

Ajar anda helah untuk menjana imej menggunakan aksara ASCII

Selalunya terdapat gambar yang dibuat daripada watak-watak di Internet, seperti ini:

Ajar anda helah untuk menjana imej menggunakan aksara ASCII

Fikirkanlah, yang utama di sini Beberapa pengetahuan digunakan, termasuk:

  • Menghuraikan warna piksel daripada imej (juga dikenali sebagai nilai RGB)

  • Pemprosesan penyahwarnaan

  • Pemetaan piksel kepada aksara

Sebagai bahasa terbaik di dunia, mudah untuk melaksanakan fungsi menarik dengan PHP. Pelaksanaan khusus diterangkan di bawah.

1. Analisis warna piksel dalam imej

Untuk menganalisis warna piksel dalam imej, kita perlu memahami format storan imej Di sini kita mengambil imej BMP sebagai contoh. apa? Tidak dapat mencari gambar BMP dalam talian? Hanya gunakan QQ untuk mengambil tangkapan skrin dan simpan sebagai BMP.

Imej BMP tidak mengandungi data piksel bermula dari bait pertama fail, tetapi setiap pengepala fail 14 bait, yang menyimpan maklumat meta fail. Di sebelahnya ialah struktur pengepala imej 40-bait, yang menyimpan maklumat meta yang berkaitan dengan imej.

Menyenaraikan setiap medan pengepala fail dan struktur pengepala imej secara terperinci agak terlalu membosankan (lihat lampiran untuk maklumat pengepala terperinci). Untuk menghuraikan piksel imej, anda hanya memerlukan 4 maklumat ini:

  • Saiz keseluruhan fail imej (bait ke-3 hingga ke-6 fail)

  • Di mana dalam fail data piksel bermula (11~14 bait)

  • Lebar dan tinggi imej (lebar: 19~22 bait, ketinggian: 23 ~26 bait)

  • Berapa banyak bait yang diduduki oleh satu piksel imej (pada 29~30 bait)

Ingin menghuraikan Ke dapatkan data dalam binari, anda boleh menggunakan unpack() digabungkan dengan substr():

$data = file_get_contents('image.bmp');$ret = unpack('v/Vsize/v/v/VpixelStart/V/Vwidth/Vheight/v/vbytePerPixel/V*6',
    substr($data, 0x0, 54));/**
 * $ret的内容:
 * array (
 *     'size' => 706554,
 *     'pixelStart' => 54,
 *     'width' => 500,
 *     'height' => 471,
 *     'bytePerPixel' => 24,
 * );
 */
Salin selepas log masuk

2 Dapatkan warna piksel dan keluarkan warna

Seperti yang anda boleh ketahui dari bahagian sebelumnya, kami mahu Untuk gambar yang diproses, data piksel bermula dari bait ke-54 fail, dan setiap data piksel menduduki 24 bit. Di antara 24 bit ini, nilai R (merah), G (hijau), dan B (biru) masing-masing menempati 8 bit (1 bait).

Jika saya ingin mendapatkan nilai RGB bagi baris x dan lajur y gambar, maka kedudukan nilai RGB yang sepadan hendaklah dikira seperti ini:

像素(x, y)的 B 值偏移 = 像素数据开始位置 + 3 * (图片宽度 * x + y)
像素(x, y)的 G 值偏移 = 像素数据开始位置 + 3 * (图片宽度 * x + y) + 1
像素(x, y)的 R 值偏移 = 像素数据开始位置 + 3 * (图片宽度 * x + y) + 2
Salin selepas log masuk

Cari nilai daripada tiga warna utama daripada formula Ia disusun dalam susunan BGR, bukan susunan RGB biasa.

Jika anda mengikuti kaedah ini dan melukis piksel satu demi satu pada kanvas mengikut urutan, anda akan mendapati gambar yang terhasil adalah terbalik Ini kerana maklumat piksel gambar disimpan secara terbalik piksel di penjuru kiri sebelah atas sebenarnya berada di hujung fail, jadi jika anda ingin mendapatkan gambar lurus ke hadapan, data piksel harus diambil seperti ini:

像素(x, y)的 B 值偏移 = 文件大小 - 3 * (图片宽度 * x + y) - 3
像素(x, y)的 G 值偏移 = 文件大小 - 3 * (图片宽度 * x + y) - 2
像素(x, y)的 R 值偏移 = 文件大小 - 3 * (图片宽度 * x + y) - 1
Salin selepas log masuk

Warna piksel diambil, tetapi imej ASCII terakhir adalah hitam dan putih. Bagaimana untuk membuang warna? Terdapat banyak algoritma untuk penyingkiran warna, berikut adalah yang paling mudah dan paling kasar:

新的R、G、B值 = [min(R, G, B) + max(R, G, B)] / 2;
Salin selepas log masuk

Piksel hitam dan putih, R, G dan B semuanya mempunyai nilai yang sama. Nilai ini boleh dipanggil kecerahan piksel

Akhir sekali, operasi mengambil piksel boleh ditakrifkan sebagai fungsi:

function getPixelColor($x, $y) {
    global $width, $size, $data;
    $b = ord($data[$size - 3 * ($width * $x + $y) - 3]);
    $g = ord($data[$size - 3 * ($width * $x + $y) - 2]);
    $r = ord($data[$size - 3 * ($width * $x + $y) - 1]);
    return (min($r, $g, $b) + max($r, $g, $b)) >> 1;
}
Salin selepas log masuk

3 Pemetaan piksel kepada aksara

Dalam langkah terakhir, kami telah untuk memetakan setiap piksel imej Tukar cahaya kepada aksara ascii. Watak ASCII sendiri tidak mempunyai warna warna. Tetapi jika anda menyusun "#" dan "." menjadi petak 100x100, secara visual "#" akan menjadi lebih gelap daripada ".".

Kita boleh mengambil beberapa aksara untuk mewakili kecerahan piksel yang berbeza Apabila kecerahan piksel tertentu berada dalam julat tertentu, gantikannya dengan tahap aksara yang sepadan:

function getChar($colorValue) {
    $map = '@#mdohsy+/-:.` ';
    return $map[(int) ($colorValue / 18)];
}
Salin selepas log masuk

dan Satu masalah: Jika setiap piksel digantikan dengan aksara, peta aksara output akan menjadi sangat besar. Jadi yang terbaik adalah menggunakan aksara untuk menggantikan blok piksel NxN dalam imej asal. Kecerahan keseluruhan blok piksel ialah purata kecerahan setiap piksel dalam blok.

Masalah di atas telah selesai Akhirnya, saya mengambil senyuman Mona Lisa untuk menguji:

Ajar anda helah untuk menjana imej menggunakan aksara ASCII

Ajar anda helah untuk menjana imej menggunakan aksara ASCII

Kesannya. cukup bagus :-). Jika latar belakang terminal berwarna putih, jujukan aksara yang mewakili kecerahan boleh diterbalikkan:

// $map = '@#mdohsy+/-:.` ';
$map = ' `.:-/+yshodm#@'; // 反过来
Salin selepas log masuk

附录

完整代码

<?php$data = file_get_contents(&#39;timg.bmp&#39;);$ret = unpack(&#39;v/Vsize/v/v/VpixelStart/V/Vwidth/Vheight/v/vbytePerPixel/V*6&#39;, substr($data, 0x0, 54));$size = $ret[&#39;size&#39;];$offset = $ret[&#39;pixelStart&#39;];$width = $ret[&#39;width&#39;];$height = $ret[&#39;height&#39;];$bitDepth = $ret[&#39;bytePerPixel&#39;];$pixelLenPerChar = 4;$charImgWidth = (int) ($width / $pixelLenPerChar);$charImgHeight = (int) ($height / $pixelLenPerChar);for ($i = 0; $i !== $charImgHeight; $i++) {    $buf = &#39;&#39;;    for ($j = 0; $j !== $charImgWidth; $j++) {        $sum = 0;        for ($k = 0; $k !== $pixelLenPerChar; $k++) {            for ($l = 0; $l !== $pixelLenPerChar; $l++) {                $sum += getPixelColor($pixelLenPerChar * $i + $k, $pixelLenPerChar * $j + $l);
            }
        }        $sum = (int) ($sum / $pixelLenPerChar / $pixelLenPerChar);        $buf = getChar($sum) . $buf;
    }    echo $buf . PHP_EOL;
}function getPixelColor($x, $y) {
    global $width, $size, $data;    $b = ord($data[$size - 3 * ($width * $x + $y) - 3]);    $g = ord($data[$size - 3 * ($width * $x + $y) - 2]);    $r = ord($data[$size - 3 * ($width * $x + $y) - 1]);    return (min($r, $g, $b) + max($r, $g, $b)) >> 1;
}function getChar($colorValue) {
    $map = &#39;@#mdohsy+/-:.` &#39;;    return $map[(int) ($colorValue / 18)];
}
Salin selepas log masuk

BMP文件头格式

偏移 大小(字节) 含义 本文中图片示例值
0 2 固定为”BM”两个字符的编码 0x42 0x4d
2 4 文件大小 0x000ac7fa
6 4 保留字段,一般为 0 0x00000000
10 4 像素数据起始处偏移 0x00000036

BMP图片头格式

偏移 大小(字节) 含义 本文中图片示例值
14 4 图片头的大小(字节) 0x00000028
18 4 图片的宽度 0x000001f4
22 4 图片的高度 0x000001d7
26 2 图像的帧数(静态图都是1) 0x0001
28 2 一个像素占的比特位数 0x0018
30 4 保留字段,一般为 0 0x000000
34 4 像素数据占用的总字节数 0x000ac7c4
38 4 保留字段,一般为 0 0x000000
42 4 保留字段,一般为 0 0x000000
46 4 保留字段,一般为 0 0x000000
50 4 保留字段,一般为 0 0x000000

推荐学习:php视频教程

Atas ialah kandungan terperinci Ajar anda helah untuk menjana imej menggunakan aksara ASCII. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Akan R.E.P.O. Ada Crossplay?
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Panduan Pemasangan dan Naik Taraf PHP 8.4 untuk Ubuntu dan Debian Panduan Pemasangan dan Naik Taraf PHP 8.4 untuk Ubuntu dan Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 membawa beberapa ciri baharu, peningkatan keselamatan dan peningkatan prestasi dengan jumlah penamatan dan penyingkiran ciri yang sihat. Panduan ini menerangkan cara memasang PHP 8.4 atau naik taraf kepada PHP 8.4 pada Ubuntu, Debian, atau terbitan mereka

Cara Menyediakan Kod Visual Studio (Kod VS) untuk Pembangunan PHP Cara Menyediakan Kod Visual Studio (Kod VS) untuk Pembangunan PHP Dec 20, 2024 am 11:31 AM

Kod Visual Studio, juga dikenali sebagai Kod VS, ialah editor kod sumber percuma — atau persekitaran pembangunan bersepadu (IDE) — tersedia untuk semua sistem pengendalian utama. Dengan koleksi sambungan yang besar untuk banyak bahasa pengaturcaraan, Kod VS boleh menjadi c

7 Fungsi PHP Saya Menyesal Saya Tidak Tahu Sebelum ini 7 Fungsi PHP Saya Menyesal Saya Tidak Tahu Sebelum ini Nov 13, 2024 am 09:42 AM

Jika anda seorang pembangun PHP yang berpengalaman, anda mungkin merasakan bahawa anda telah berada di sana dan telah melakukannya. Anda telah membangunkan sejumlah besar aplikasi, menyahpenyahpepijat berjuta-juta baris kod dan mengubah suai sekumpulan skrip untuk mencapai op

Bagaimana anda menghuraikan dan memproses HTML/XML dalam PHP? Bagaimana anda menghuraikan dan memproses HTML/XML dalam PHP? Feb 07, 2025 am 11:57 AM

Tutorial ini menunjukkan cara memproses dokumen XML dengan cekap menggunakan PHP. XML (bahasa markup extensible) adalah bahasa markup berasaskan teks yang serba boleh yang direka untuk pembacaan manusia dan parsing mesin. Ia biasanya digunakan untuk penyimpanan data

Jelaskan JSON Web Tokens (JWT) dan kes penggunaannya dalam PHP API. Jelaskan JSON Web Tokens (JWT) dan kes penggunaannya dalam PHP API. Apr 05, 2025 am 12:04 AM

JWT adalah standard terbuka berdasarkan JSON, yang digunakan untuk menghantar maklumat secara selamat antara pihak, terutamanya untuk pengesahan identiti dan pertukaran maklumat. 1. JWT terdiri daripada tiga bahagian: header, muatan dan tandatangan. 2. Prinsip kerja JWT termasuk tiga langkah: menjana JWT, mengesahkan JWT dan muatan parsing. 3. Apabila menggunakan JWT untuk pengesahan di PHP, JWT boleh dijana dan disahkan, dan peranan pengguna dan maklumat kebenaran boleh dimasukkan dalam penggunaan lanjutan. 4. Kesilapan umum termasuk kegagalan pengesahan tandatangan, tamat tempoh, dan muatan besar. Kemahiran penyahpepijatan termasuk menggunakan alat debugging dan pembalakan. 5. Pengoptimuman prestasi dan amalan terbaik termasuk menggunakan algoritma tandatangan yang sesuai, menetapkan tempoh kesahihan dengan munasabah,

Program PHP untuk mengira vokal dalam rentetan Program PHP untuk mengira vokal dalam rentetan Feb 07, 2025 pm 12:12 PM

Rentetan adalah urutan aksara, termasuk huruf, nombor, dan simbol. Tutorial ini akan mempelajari cara mengira bilangan vokal dalam rentetan yang diberikan dalam PHP menggunakan kaedah yang berbeza. Vokal dalam bahasa Inggeris adalah a, e, i, o, u, dan mereka boleh menjadi huruf besar atau huruf kecil. Apa itu vokal? Vokal adalah watak abjad yang mewakili sebutan tertentu. Terdapat lima vokal dalam bahasa Inggeris, termasuk huruf besar dan huruf kecil: a, e, i, o, u Contoh 1 Input: String = "TutorialSpoint" Output: 6 menjelaskan Vokal dalam rentetan "TutorialSpoint" adalah u, o, i, a, o, i. Terdapat 6 yuan sebanyak 6

Terangkan pengikatan statik lewat dalam php (statik: :). Terangkan pengikatan statik lewat dalam php (statik: :). Apr 03, 2025 am 12:04 AM

Mengikat statik (statik: :) Melaksanakan pengikatan statik lewat (LSB) dalam PHP, yang membolehkan kelas panggilan dirujuk dalam konteks statik dan bukannya menentukan kelas. 1) Proses parsing dilakukan pada masa runtime, 2) Cari kelas panggilan dalam hubungan warisan, 3) ia boleh membawa overhead prestasi.

Apakah kaedah Magic PHP (__construct, __destruct, __call, __get, __set, dll) dan menyediakan kes penggunaan? Apakah kaedah Magic PHP (__construct, __destruct, __call, __get, __set, dll) dan menyediakan kes penggunaan? Apr 03, 2025 am 12:03 AM

Apakah kaedah sihir PHP? Kaedah sihir PHP termasuk: 1. \ _ \ _ Membina, digunakan untuk memulakan objek; 2. \ _ \ _ Destruct, digunakan untuk membersihkan sumber; 3. \ _ \ _ Call, mengendalikan panggilan kaedah yang tidak wujud; 4. \ _ \ _ Mendapatkan, melaksanakan akses atribut dinamik; 5. \ _ \ _ Set, melaksanakan tetapan atribut dinamik. Kaedah ini secara automatik dipanggil dalam situasi tertentu, meningkatkan fleksibiliti dan kecekapan kod.

See all articles