国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Heim Backend-Entwicklung PHP-Tutorial Entwicklungshinweise zur PHP-Erweiterung (10) Passen Sie die IO-Funktion in der libpng-Bibliothek an, um Bilder in den Speicher zu schreiben

Entwicklungshinweise zur PHP-Erweiterung (10) Passen Sie die IO-Funktion in der libpng-Bibliothek an, um Bilder in den Speicher zu schreiben

Aug 08, 2016 am 09:21 AM
null png size write

Bei der Entwicklung dieser QR-Code-Erweiterung dcode ist es notwendig, das generierte QR-Code-PNG-Bild in Form einer Zeichenfolge an den Anrufer zurückzugeben, anstatt direkt eine Datei zu generieren. Dies ist praktischer, da keine Notwendigkeit besteht um Dateien zu manipulieren und die Bedienung der Dateien vollst?ndig dem Benutzer zu überlassen.

Die libpng-Bibliothek wird zum Generieren von Bildern verwendet. Für Dokumente zu libpng k?nnen Sie hier zum PNG-Dokument gehen. Als ich diese Bibliothek zum Kompilieren meiner Erweiterung unter Ubuntu 14.04 verwendete, hatte ich immer noch ein kleines Problem: png_create_write_struct in ?Unknown“ in Zeile 0 unter Ubuntu 14. Nach der Suche im Internet ist es immer noch sehr h?ufig.

Der Code ist unten einfach aufgeführt:

<code><span>/** {{{ dcode_png_writer()
 * function is custom png_write callback function
 * Return void */</span><span>static</span><span>void</span> dcode_png_writer(png_structp png_ptr, png_bytep data, png_size_t length)
{
    png_mem_encode* p = (png_mem_encode*) png_get_io_ptr(png_ptr);
    size_t nsize = p->size + length;

    <span>if</span> (p->buffer)
        p->buffer = erealloc(p->buffer, nsize);
    <span>else</span>
        p->buffer = emalloc(nsize);

    <span>if</span> (!p->buffer)
    {
        png_error(png_ptr, <span>"PNG allocate memory error"</span>);
        <span>exit</span>(FAILURE);
    }

    <span>memcpy</span>(p->buffer + p->size, data, length);
    p->size += length;
}
<span>/* }}} */</span></code>
<code><span>/** {{{ dcode_write_to_png()
 * write qrcode struct to memory
 * Return char* */</span><span>static</span><span>char</span>* dcode_write_to_png(QRcode *qrcode, <span>int</span> size, <span>int</span> margin, <span>int</span> *pp_len)
{

    png_structp png_ptr;
    png_infop info_ptr;

    <span>unsigned</span><span>char</span> *row, *p, *q;
    <span>int</span> x, y, xx, yy, bit;
    <span>int</span> realwidth;

    realwidth = (qrcode->width + margin * <span>2</span>) * size;
    <span>int</span> row_fill_len = (realwidth + <span>7</span>) / <span>8</span>;

    png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
    <span>if</span> (png_ptr == NULL)
    {
        php_error(E_ERROR, <span>"Failed to initialize PNG writer"</span>);
        <span>return</span> NULL;
    }

    info_ptr = png_create_info_struct(png_ptr);
    <span>if</span> (info_ptr == NULL)
    {
        php_error(E_ERROR, <span>"Failed to initialize PNG info"</span>);
        <span>return</span> NULL;
    }

    <span>if</span> (setjmp(png_jmpbuf(png_ptr)))
    {
        png_destroy_write_struct(&png_ptr, &info_ptr);
        php_error(E_ERROR, <span>"Failed to set PNG jmpbuf"</span>);
        <span>return</span> NULL;
    }

    row = (<span>unsigned</span><span>char</span> *) emalloc(row_fill_len);
    <span>if</span> (row == NULL)
    {
        png_destroy_write_struct(&png_ptr, &info_ptr);
        php_error(E_ERROR, <span>"Failed to allocate memory"</span>);
        <span>return</span> NULL;
    }

    png_mem_encode state = {NULL, <span>0</span>};
    png_set_write_fn(png_ptr, &state, &dcode_png_writer, NULL);

    png_set_IHDR(png_ptr,
                info_ptr,
                realwidth,
                realwidth,
                <span>1</span>,
                PNG_COLOR_TYPE_GRAY,
                PNG_INTERLACE_NONE,
                PNG_COMPRESSION_TYPE_DEFAULT,
                PNG_FILTER_TYPE_DEFAULT);

    png_write_info(png_ptr, info_ptr);
    <span>memset</span>(row, <span>0xff</span>, (realwidth + <span>7</span>) / <span>8</span>);
    <span>for</span>(y = <span>0</span>; y < margin * size; y ++) {
        png_write_row(png_ptr, row);
    }

    p = qrcode->data;
    <span>for</span>(y = <span>0</span>; y < qrcode->width; y ++) {
        bit = <span>7</span>;
        <span>memset</span>(row, <span>0xff</span>, (realwidth + <span>7</span>) / <span>8</span>);
        q = row;
        q += margin * size / <span>8</span>;
        bit = <span>7</span> - (margin * size % <span>8</span>);
        <span>for</span>(x = <span>0</span>; x < qrcode->width; x ++) {
            <span>for</span>(xx = <span>0</span>; xx <size; xx ++) {
                *q ^= (*p & <span>1</span>) << bit;
                bit--;
                <span>if</span>(bit < <span>0</span>) {
                    q++;
                    bit = <span>7</span>;
                }
            }
            p++;
        }
        <span>for</span>(yy = <span>0</span>; yy < size; yy ++ ) {
            png_write_row(png_ptr, row);
        }
    }

    <span>memset</span>(row, <span>0xff</span>, (realwidth + <span>7</span>) / <span>8</span>);
    <span>for</span>(y = <span>0</span>; y < margin * size; y ++) {
        png_write_row(png_ptr, row);
    }

    png_write_end(png_ptr, info_ptr);
    png_destroy_write_struct(&png_ptr, &info_ptr);

    efree(row);

    <span>char</span> *bin_data = NULL;
    <span>if</span> (state.buffer) {
        bin_data = estrndup(state.buffer, state.size);
        *pp_len = state.size;
        efree(state.buffer);
    }

    <span>return</span> bin_data;
}
<span>/** }}} */</span></code>
  1. Die erste Funktion dcode_png_writer ist eine benutzerdefinierte Rückruffunktion zum Schreiben von PNG-Daten.
  2. Die zweite Funktion dcode_write_to_png besteht darin, QRcode-Daten in PNG zu schreiben

Sie k?nnen sich haupts?chlich diesen Teil ansehen

<code>png_set_write_fn(png_ptr, &state, &dcode_png_writer, NULL);</code>

Dieser Ort nennt das Selbst The Die definierte Schreibfunktion dcode_png_writer schreibt Daten in die Struktur state. Die Struktur state lautet wie folgt: Die Funktion

<code><span>typedef</span><span>struct</span> _png_mem_encode {
    <span>char</span> *buffer;
    size_t size;
} png_mem_encode ;</code>

png_set_write_fn legt eine benutzerdefinierte Schreibfunktion fest, um Daten über dcode_png_writer zu schreiben wie Zustand und dynamisch Speicher zuweisen.

Für die Definition von png_set_write_fn k?nnen Sie sich auf das oben erw?hnte PNG-Dokument beziehen. Benutzerdefinierte Funktionen k?nnen auch die Fehlerbehandlung und andere Funktionen anpassen, sodass error handler stattdessen entsprechend der tats?chlichen Situation übernommen werden kann es intern beenden zu lassen. Weitere verwandte Codes finden Sie in der DCode-Erweiterung

. Die Geschwindigkeit der QRCode-Generierung ist immer noch sehr hoch. Wenn Sie for ($i = 0; $i < 10000; $i ) und $i als Parameter verwenden, k?nnen 10.000 QRCodes in 3 Sekunden generiert werden.

Urheberrechtserkl?rung: Dieser Artikel ist ein Originalartikel des Bloggers und darf nicht ohne die Erlaubnis des Bloggers reproduziert werden.

Das Obige stellt die Entwicklungshinweise zur PHP-Erweiterung vor (10). Passen Sie die IO-Funktion in der libpng-Bibliothek an und schreiben Sie Bilder in den Speicher, einschlie?lich des Inhalts. Ich hoffe, dass dies für Freunde hilfreich ist, die sich für PHP-Tutorials interessieren.

Erkl?rung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Hei?e KI -Werkzeuge

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem v?llig kostenlosen KI-Gesichtstausch-Tool aus!

Hei?e Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Hei?e Themen

PHP-Tutorial
1502
276
So konvertieren Sie PNG in JPG unter Windows 11 So konvertieren Sie PNG in JPG unter Windows 11 May 12, 2023 pm 03:55 PM

So konvertieren Sie PNG in JPG unter Windows 11. Unter Windows 10 und 11 k?nnen Sie die integrierte Paint-App von Microsoft verwenden, um Bilddateien schnell zu konvertieren. Um ein PNG-Bild in JPG unter Windows 11 zu konvertieren, führen Sie die folgenden Schritte aus: ?ffnen Sie den Datei-Explorer und navigieren Sie zu dem PNG-Bild, das Sie konvertieren m?chten. Klicken Sie mit der rechten Maustaste auf das Bild und w?hlen Sie im Menü ??ffnen mit“ > ?Zeichnen“. Ihr Foto oder Bild wird in der Paint-App ge?ffnet. Beachten Sie die Dateigr??e am unteren Bildschirmrand. Um eine Datei von PNG in JPG zu konvertieren, klicken Sie auf Datei und w?hlen Sie im Menü Speichern unter > JPEG-Bild. Wenn die Dateiressource

Verwenden Sie die Funktion File.length() von Java, um die Gr??e der Datei zu ermitteln Verwenden Sie die Funktion File.length() von Java, um die Gr??e der Datei zu ermitteln Jul 24, 2023 am 08:36 AM

Verwenden Sie die File.length()-Funktion von Java, um die Gr??e einer Datei zu ermitteln. Die Dateigr??e ist eine sehr h?ufige Anforderung beim Umgang mit Dateioperationen. Java bietet eine sehr praktische M?glichkeit, die Gr??e einer Datei zu ermitteln, d. h. mithilfe der L?nge(. )-Methode der File-Klasse. In diesem Artikel wird erl?utert, wie Sie mit dieser Methode die Gr??e einer Datei ermitteln und entsprechende Codebeispiele angeben. Zuerst müssen wir ein File-Objekt erstellen, um die Datei darzustellen, deren Gr??e wir ermitteln m?chten. So erstellen Sie ein File-Objekt: Filef

Was ist der Unterschied zwischen null und NULL in der C-Sprache? Was ist der Unterschied zwischen null und NULL in der C-Sprache? Sep 22, 2023 am 11:48 AM

Der Unterschied zwischen null und NULL in der C-Sprache ist: null ist eine Makrodefinition in der C-Sprache, die normalerweise zur Darstellung eines Nullzeigers verwendet wird und zum Initialisieren von Zeigervariablen oder zum Bestimmen, ob der Zeiger in einer bedingten Anweisung null ist, verwendet werden kann. NULL ist eine Makrodefinition in der C-Sprache. Eine vordefinierte Konstante in, die normalerweise zur Darstellung eines Nullwerts verwendet wird und zur Darstellung eines Nullzeigers, eines Nullzeigerarrays oder eines Nullstrukturzeigers verwendet wird.

So benennen Sie die Erweiterung aller Dateien in einem Ordner um, einschlie?lich Unterordnern So benennen Sie die Erweiterung aller Dateien in einem Ordner um, einschlie?lich Unterordnern Apr 14, 2023 pm 12:22 PM

Angenommen, Sie müssen die Erweiterung einer Datei von einer Erweiterung in eine andere umbenennen, beispielsweise von jpg in png. Es ist natürlich ganz einfach! Was aber, wenn Sie mehrere Dateien haben, deren Erweiterungen ge?ndert werden müssen? Oder noch schlimmer: Was w?re, wenn sich diese mehreren Dateien auch in mehreren Ordnern und Unterordnern innerhalb eines einzigen Ordners befinden? Nun, für einen normalen Menschen kann das ein Albtraum sein. Aber für einen Geek absolut nicht. Die Frage ist nun: Bist du ein Geek? Nun, mit Hilfe von Geek Page ist das definitiv der Fall! In diesem Artikel erkl?ren wir, wie Sie die Erweiterung aller Dateien in einem Ordner, einschlie?lich der Unterordner Ihrer Wahl, mithilfe einer Batch-Skript-Methode einfach von einer Erweiterung in eine andere umbenennen k?nnen. Beachten:

Was bedeuten undefiniert und null? Was bedeuten undefiniert und null? Nov 20, 2023 pm 02:39 PM

In JavaScript stellen sowohl undefiniert als auch null das Konzept von ?nichts“ dar: 1. undefiniert stellt eine nicht initialisierte Variable oder eine nicht vorhandene Eigenschaft dar. Wenn eine Variable deklariert, ihr aber kein Wert zugewiesen ist, ist der Wert der Variablen undefiniert. Beim Zugriff auf Eigenschaften, die nicht im Objekt vorhanden sind, ist der zurückgegebene Wert ebenfalls undefiniert. 2. Null stellt eine leere Objektreferenz dar. In einigen F?llen kann die Objektreferenz auf Null gesetzt werden, um den von ihr belegten Speicher freizugeben.

Was ist der Unterschied zwischen null und undefiniert? Was ist der Unterschied zwischen null und undefiniert? Nov 08, 2023 pm 04:43 PM

Der Unterschied zwischen null und undefiniert ist: 1. Semantische Bedeutung; . Leistung bei der JSON-Serialisierung; 9. Beziehung zu Typen. Detaillierte Einführung: 1. Semantische Bedeutung: Null bedeutet normalerweise, dass diese Variable keinen gültigen Objektwert hat, w?hrend undefiniert normalerweise bedeutet, dass der Variablen kein Wert zugewiesen wurde oder das Objekt dieses Attribut nicht hat. 2. Verwendungsszenarien , usw.

Was sind die Verwendungszwecke von null in Java? Was sind die Verwendungszwecke von null in Java? Mar 01, 2024 am 10:10 AM

Verwendung: 1. Initialisieren Sie die Referenztypvariable auf Null, um anzuzeigen, dass die Variable derzeit auf kein Objekt zeigt. 2. Setzen Sie die Referenztypvariable auf Null, wodurch der Speicherplatz des von der Variablen referenzierten Objekts freigegeben und dies unterstützt werden kann 3. Verwenden Sie null, um zu prüfen, ob eine Referenz leer ist. Sie k?nnen das Auftreten einer NullPointerException vermeiden, indem Sie beurteilen, ob die Referenz leer ist.

Was bedeutet Schreiben in Python? Was bedeutet Schreiben in Python? Mar 07, 2024 am 10:01 AM

Write in Python ist eine Methode zum Schreiben einer Zeichenfolge in eine Datei. Das Syntaxformat ist ?fileObject.write([str])“, wobei str sich auf die Zeichenfolge bezieht, die in die Datei geschrieben werden soll.

See all articles