Pemrosesan Gambar ReactJS - NodeJS

Selamat siang.

Saya menghabiskan pembekalan di Reactjs (sisi klien) dan Nodejs (sisi server).

Baru-baru ini, dalam proyek kecil saya, muncul pertanyaan tentang seberapa mudah dan sederhana mungkin untuk bertukar gambar dari jenis client-server.

Hari ini kita akan belajar bagaimana mengirim data biner (khususnya gambar) dari sisi klien dan memprosesnya di server. Selamat datang di kucing.

Jika aplikasi web Anda adalah jejaring sosial atau messenger atau yang serupa, maka Anda tentu harus bekerja dengan data biner, dalam kebanyakan kasus itu adalah pemrosesan gambar. Ini akan dibahas.

Untuk memiliki ide umum, saya akan menafsirkannya secara berurutan.

Lihatlah yang berikut ini


  1. Sistem angka biner dan sistem angka desimal
  2. Halaman Kode : ASCII , Unicode
  3. Bit dan byte
  4. Format hex
  5. File biner
  6. Penyangga dan simpul simpul
  7. ArrayBuffer dan Uint8Array
  8. Filereader

Sistem angka biner dan sistem angka desimal.


Ini adalah angka yang ditulis menggunakan dua karakter: satu dan nol.
Secara sederhana, ini adalah 2 (basis) dengan kekuatan n (jumlah digit), misalnya, angka 10001 memiliki 5 digit:

4 digit = 1; 2 ^ 4 = 16;
3 digit = 0;
2 digit = 0;
1 digit = 0;
0 digit = 1; 2 ^ 0 = 1;

1-true - membuat perhitungan;
0-false - jangan menghitung;

Hasilnya, kami mendapatkan 16 +1 = 17;
Dengan operasi terbalik, komputer menyajikan data dalam bentuk biner.

const num = 17; //  
const binNum = num.toString(2); //    
const initNum = parseInt(binNum, 2); //  

Sistem angka desimal adalah angka yang ditulis menggunakan 10 karakter, dari 0 - 9. Kami menggunakannya setiap hari.

Faktanya adalah bahwa komputer hidup dengan penyajian informasinya. Jika kita menulis dalam bahasa ibu kita atau menghitung dalam desimal, maka untuk komputer semua ini adalah representasi biner. Anda bertanya: "Apa arti representasi biner?". Seperti yang dikatakan oleh guru bahasa Inggris saya, "saat Anda mendengarnya, ada tertulis". Komputer menyajikan file yang berisi teks atau lainnya, atau perhitungan apa pun dalam sistem angka biner - ini adalah representasi biner. Bahasa mesin, angka "17" adalah - 10001.

Halaman Kode: ASCII, Unicode


Muncul pertanyaan. Sudah jelas dengan angka, tetapi bagaimana dengan teks? Bagaimana mesin mengubah teks menjadi biner? Semuanya sederhana. Untuk melakukan ini, ada penyandian seperti ASCII atau Unicode. Ini adalah tabel sederhana ( halaman kode ), di mana ada pemetaan ke nomor karakter kita, misalnya, karakter "S" adalah angka 53 menurut tabel ASCII, maka komputer akan menampilkan angka 53 dalam bentuk biner - 110101.
Berkenaan dengan Unicode, ini adalah standar yang kuat yang mencakup Pengkodean UTF-8, yang sangat diminati dalam ruang-web dan sistem mirip-unix. Prinsip operasi adalah umum.

Bit dan byte


Bit adalah unit pengukuran informasi oleh komputer. Dan kita sudah tahu bagaimana komputer merepresentasikan informasi. Iya! Kamu benar. Satu bit adalah 1 atau 0. Untuk komputer, 1 atau 0 adalah sesuatu seperti transistor, benar atau salah. Sekarang sama sekali tidak sulit untuk memahami apa itu byte - itu adalah 8 bit, itu juga disebut oktet (dari jenisnya terdiri dari 8).

Format hex


Kami beralih ke format "hex". Kami berbicara tentang sistem bilangan biner, sistem desimal, antara lain, ada sistem bilangan heksadesimal, huruf akan mengerti apa yang saya maksud. Ini adalah angka yang ditulis menggunakan 16 karakter, dari 0 - 9 dan dari af. Muncul pertanyaan: "Mengapa begitu rumit?". Karena unit memori adalah byte 8-bit, tetap lebih nyaman untuk menulis nilainya dalam dua digit heksadesimal. Juga, dalam standar Unicode, nomor karakter biasanya ditulis dalam bentuk heksadesimal menggunakan setidaknya 4 digit.
Format ini berfungsi sebagai berikut: untuk byte 8-bit, ia membagi 8 bit berdasarkan gender, yaitu, 10101011 - 1010 | 1011, setelah mengubah setiap bagian sesuai. 1010-a, 1011-b;

const num = 196; //  
const hexNum = num.toString(16); //   hex 
const initNum = parseInt(hexNum, 16); //     -  

File biner


Kami beralih ke item berikutnya, itu juga disebut file biner - itu adalah array byte. Mengapa biner? Bytes terdiri dari bit, yaitu karakter dari sistem bilangan biner, maka namanya adalah biner. Benar-benar semua file masuk ke dalam kategori file biner, yaitu file yang berisi teks, gambar - semua ini adalah file biner, maka data biner, maka data biner.

Seringkali data biner dihasilkan oleh karakter halaman kode ASCII, serta dalam format hex, pada gambar tertentu. Saya akan memberi contoh. Kami memiliki gambar berikut:

Tonton lampiran


Visualisasi parsialnya direpresentasikan sebagai hex-agent-smith

Tonton lampiran

ASCII, hex , .

ArrayBuffer dan Uint8Array


ArrayBuffer - objek untuk bekerja dengan data biner dalam javascript. Memperbaiki panjang memori untuk bekerja dengan biner. Misalnya: new ArrayBuffer (256) - membuat objek mirip array dengan ukuran 256 byte, tidak lebih - tidak kurang. Setiap byte memiliki informasi spesifik. ArrayBuffer bukan array dan metode array tidak berlaku untuk itu. Anda bertanya, bagaimana cara menggunakannya? Objek Uint8Array memberikan representasi ArrayBuffer dalam angka 8-bit yang tidak ditandai, yaitu dari 0 - 255.

Filereader


FileReader ? Ini adalah konstruktor untuk membuat yang berikut ini:

<input type="file">

Apa berikutnya?


Sekarang perhatikan contoh bagus yang menunjukkan pemrosesan gambar:

  1. Modul ReactJS
    import React, {useState, useRef, useCallback} from 'react';
    import axios from 'axios';
    
    export const UPLOAD_AVATAR = 'http://localhost:8080/api/upload_avatar';
    
    function App() {
      //   ref   FileReader
      const fileRef = useRef(null);
      const [ loading, setLoading ] = useState(false);
    
      const handleSubmit = useCallback( event => {
        event.preventDefault();
    
        const fetchData = async (uint8Array) => {
          try {
            const response = await axios({
              method: 'post',
              url: UPLOAD_AVATAR,
              data: [...uint8Array] //    JSON,   
            });
    
            setLoading(false);
            console.log(response);
          } catch (e) {
            console.error(e.message, 'function handleSubmit')
          }
        };
    
        if(!fileRef.current) return void null;
    
        const reader = new FileReader();
        reader.onloadend = () => {
          const uint8Array = new Uint8Array(reader.result);
          setLoading(true);
          fetchData(uint8Array);
        };
    
    
        //  
        reader.readAsArrayBuffer(fileRef.current[0]);
    
        //  reader.readAsBinaryString(fileRef.current[0]) 
        //  MDN,
        //      File API specification, 
        //    
        //  ,     
        //  readAsArrayBuffer
        // https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsBinaryString
      }, []);
    
      const nodeDom = (
        <form onSubmit={handleSubmit}>
          <div>
            <input
              onChange={e => fileRef.current = e.target.files}
              accept="image/*"
              type="file"
              id="button-file"
            />
          </div>
          <button type="submit">{loading ? '...' : ''}</button>
        </form>
      );
    
      return nodeDom
    }
    
    export default App;
    
                   

  2. Modul ExpressJS
    const express = require("express");
    const cors = require("cors");
    
    const crypto = require('crypto');
    const fs = require('fs');
    
    const PORT = 8080;
    
    const app = express();
    
    app.use(express.static("public"));
    app.use(express.json({ limit: "50mb" }));
    app.use(cors());
    
    app.post("/api/upload_avatar", (req, res) => {
      console.log(req.body);
      const randomString = crypto.randomBytes(5).toString('hex');
      const stream = fs.createWriteStream(`./public/images/${randomString}.png`);
    
      stream.on('finish', function () {
        console.log('file has been written');
        res.end('file has been written');
      });
    
      stream.write(Buffer.from(req.body), 'utf-8');
      stream.end();
    });
    
    app.listen(PORT, () => console.log(`Server running at ${PORT}`));
    
                  


Total:


  • Mengapa kita perlu pengkodean
  • Tampilan umum data biner
  • Cara yang disarankan untuk mengirim byte
  • Objek penyangga
  • Objek FileReader
  • Implementasi sederhana pada kait

All Articles