معالجة صور ReactJS - NodeJS

يوم جيد.

أقضي استخلاص المعلومات على Reactjs (جانب العميل) و Nodejs (جانب الخادم).

في الآونة الأخيرة ، في مشروعي الصغير ، نشأ السؤال عن مدى سهولة وبساطة تبادل الصور من نوع خادم العميل.

اليوم سنتعلم كيفية إرسال البيانات الثنائية (خاصة الصور) من جانب العميل ومعالجتها على الخادم. مرحبا بكم في القطط.

إذا كان تطبيق الويب الخاص بك عبارة عن شبكة اجتماعية أو مراسلة أو شيء مشابه ، فسيتعين عليك بالتأكيد العمل مع البيانات الثنائية ، وفي معظم الحالات تكون معالجة الصور. سيتم مناقشة هذا.

للحصول على فكرة عامة ، سأفسرها بالتتابع.

نلقي نظرة على ما يلي


  1. نظام الأرقام الثنائية ونظام الأرقام العشرية
  2. صفحة الرموز : ASCII ، Unicode
  3. بت و بايت
  4. تنسيق سداسي عشري
  5. ملف ثنائي
  6. خيوط العازلة و nodejs
  7. ArrayBuffer و Uint8Array
  8. مترجم

نظام الأرقام الثنائية ونظام الأرقام العشرية.


هذا رقم مكتوب باستخدام حرفين: واحد وأصفار.
بعبارات بسيطة ، يكون 2 (أساس) إلى قوة n (عدد الأرقام) ، على سبيل المثال ، الرقم 10001 يحتوي على 5 أرقام:

4 أرقام = 1 ؛ 2 ^ 4 = 16 ؛
3 أرقام = 0 ؛
2 رقم = 0 ؛
1 رقم = 0 ؛
0 رقم = 1 ؛ 2 ^ 0 = 1 ؛

1-صحيح - إجراء حساب ؛
0-خطأ - لا تحسب ؛

ونتيجة لذلك نحصل على 16 + 1 = 17 ؛
مع العملية العكسية ، يقدم الكمبيوتر البيانات في شكل ثنائي.

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

نظام الرقم العشري هو رقم مكتوب باستخدام 10 أحرف ، من 0 إلى 9. نستخدمها كل يوم.

الحقيقة هي أن الكمبيوتر يعيش من خلال عرضه للمعلومات. إذا كنا نكتب بلغتنا الأم أو نحسب بالعدد العشري ، فإن هذا يمثل تمثيل ثنائي للكمبيوتر. تسأل: "ماذا يعني التمثيل الثنائي؟". كما قال أستاذ اللغة الإنجليزية ، "كما تسمعه ، إنه مكتوب". يقدم الكمبيوتر ملفات تحتوي على نص أو غير ذلك ، أو أي حسابات في نظام الأرقام الثنائية - هذا هو التمثيل الثنائي. لغة الآلة عدد 17010001.

صفحة الرموز: ASCII ، Unicode


استخراج أو تكوين السؤال. إنه واضح بالأرقام ، ولكن ماذا عن النص؟ كيف ستحول الآلة النص إلى ثنائي؟ كل شيء بسيط. لهذا ، هناك ترميزات مثل ASCII أو Unicode. هذا جدول بسيط ( صفحة الرموز ) ، حيث يوجد تعيين لرقم حرفنا ، على سبيل المثال ، الحرف "S" هو الرقم 53 وفقًا لجدول ASCII ، ثم سيقدم الكمبيوتر الرقم 53 في شكل ثنائي - 110101.
فيما يتعلق بـ Unicode ، يعد هذا معيارًا قويًا يتضمن تشفير UTF-8 ، وهو مطلوب بشكل كبير في أنظمة مساحة الويب والأنظمة الشبيهة بنظام يونكس. مبدأ التشغيل عام.

بت والبايت


البت هو وحدة لقياس المعلومات بواسطة الكمبيوتر. ونحن نعلم بالفعل كيف يمثل الكمبيوتر المعلومات. نعم! أنت على حق. بت واحد هو 1 أو 0. بالنسبة للكمبيوتر ، 1 أو 0 هو شيء مثل الترانزستور ، صحيح أو خطأ. الآن ليس من الصعب على الإطلاق فهم ما هو البايت - إنه 8 بت ، ويسمى أيضًا ثماني بتات (من النوع يتكون من 8).

تنسيق سداسي عشري


ننتقل إلى تنسيق "ست عشري". تحدثنا عن نظام الأرقام الثنائية ، النظام العشري ، من بين أمور أخرى ، هناك نظام أرقام سداسي عشري ، سوف يفهم مطبعي ما أعنيه. هذا الرقم مكتوب باستخدام 16 حرفًا ، من 0 إلى 9 ومن af. السؤال الذي يطرح نفسه: "لماذا هو معقد للغاية؟". نظرًا لأن وحدة الذاكرة عبارة عن بايت 8 بت ، فمن الأسهل كتابة قيمتها في رقمين سداسي عشري. أيضًا ، في معيار Unicode ، عادة ما يتم كتابة رقم الحرف في شكل سداسي عشري باستخدام 4 أرقام على الأقل.
يعمل هذا التنسيق كما يلي: في حالة بايت 8 بت ، يقسم 8 بتات حسب الجنس ، أي 10101011 - 1010 | 1011 ، بعد تحويل كل جزء وفقًا لذلك. 1010 أ ، 1011 ب ؛

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

ملف ثنائي


ننتقل إلى العنصر التالي ، ويطلق عليه أيضًا ملف ثنائي - وهو عبارة عن مجموعة من البايت. لماذا ثنائي؟ تتكون البايتات من وحدات البت ، أي أحرف نظام الأعداد الثنائية ، ومن ثم يكون الاسم ثنائيًا. تمامًا تناسب جميع الملفات فئة الملف الثنائي ، أي الملفات التي تحتوي على نص ، صور - كل هذه ملفات ثنائية ، وبالتالي بيانات ثنائية ، وبالتالي بيانات ثنائية.

غالبًا ما يتم إخراج البيانات الثنائية عن طريق أحرف صفحة الرموز ASCII ، وكذلك بتنسيق سداسي عشري ، في صور معينة. سوف أعطي مثالا على ذلك. لدينا الصورة التالية:

مشاهدة المرفق


يتم تمثيل التصور الجزئي لها على أنها سداسي عامل-سميث

مشاهدة المرفق

ASCII, hex , .

ArrayBuffer و Uint8Array


ArrayBuffer - كائن للعمل مع البيانات الثنائية في جافا سكريبت. يعمل على إصلاح طول الذاكرة للعمل مع الثنائي. على سبيل المثال: ArrayBuffer (256) الجديد - ينشئ كائنًا يشبه الصفيف بحجم 256 بايت ، لا أكثر - لا أقل. يحتوي كل بايت على معلومات محددة. ArrayBuffer ليس مصفوفة وأساليب المصفوفة غير قابلة للتطبيق عليه. تسأل سؤال ، كيف تستخدمه؟ يعطي كائن Uint8Array تمثيل ArrayBuffer في رقم 8 بت غير موقّع ، أي من 0 إلى 255.

مترجم


FileReader ؟ هذا هو المُنشئ لإنشاء ما يلي:

<input type="file">

ماذا بعد؟


الآن فكر في مثال رائع يوضح معالجة الصور:

  1. وحدة 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. وحدة 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}`));
    
                  


مجموع:


  • لماذا نحتاج إلى ترميزات
  • نظرة عامة على البيانات الثنائية
  • الطريقة الموصى بها لإرسال وحدات البايت
  • كائن عازلة
  • كائن FileReader
  • تنفيذ بسيط على الخطافات

All Articles