suchen
HeimWeb-FrontendH5-TutorialSo zoomen und laden Sie Bilder über die Canvas- und Datei-API hoch

In diesem Artikel wird hauptsächlich das Zoomen und Hochladen von Bildern über die Canvas- und Datei-API beschrieben. Jetzt kann ich ihn mit allen Freunden teilen, die ihn benötigen.

Erstellen Sie einen Benutzer, der dies tut kümmert sich um die Benutzeroberfläche und ermöglicht Ihnen die Steuerung der Bildgröße. Die auf den Server hochgeladenen Daten müssen nicht die Situation bewältigen, in der es sich um mehrteilige/Formulardaten handelt. Ein einfacher POST-Formularhandler reicht aus. Das vollständige Codebeispiel finden Sie unten Beispieladresse: Canvas Resize Demo
Originalautor: Dr. Tom Trenka
Originaldatum: 6. August 2013
Übersetzungsdatum: 8. August 2013

Tom Trenka kann einen Artikel schreiben für „ „mein“ Blog ist für mich eine große Ehre. Tom war einer der ursprünglichen Mitwirkenden am Dojo-Framework und mein Mentor bei SitePen. Ich habe seine Genialität auf höchstem Niveau erlebt und er war immer der Erste, der viele schwierige Probleme mit zukunftsweisenden Lösungen vorhergesehen hat. Er denkt immer von außen und löst Randprobleme auf unkonventionelle, aber solide Weise. Dieser Artikel ist ein perfektes Beispiel.
In letzter Zeit wurde ich häufig nach der Erstellung einer Benutzeroberflächen-API gefragt, mit der Benutzer (unter anderem) Bilder auf einen Server hochladen und auf der Clientseite der zahlreichen von unserem Unternehmen unterstützten Websites verwendet werden können. Normalerweise ist dies eine sehr einfache Sache: Erstellen Sie ein Formular, fügen Sie ein Eingabefeld für den Dateityp hinzu, lassen Sie den Benutzer ein Bild vom Computer auswählen und legen Sie das Formular enctype="multipart/form-data" in den Formular-Tag-Eigenschaften fest und laden Sie es dann hoch . Ziemlich einfach, nicht wahr? Tatsächlich ist hier ein recht einfaches Beispiel; klicken Sie, um es einzugeben.
Aber was ist, wenn Sie das Bild vor dem Hochladen auf irgendeine Weise vorverarbeiten möchten? Beispielsweise müssen Sie zuerst die Bildgröße komprimieren, oder Sie möchten, dass das Bild nur in bestimmten Formattypen wie PNG oder JPG vorliegt. Was sollten Sie tun?
Verwenden Sie Canvas, um das Problem zu lösen!

Einführung in Canvas
Canvas ist ein neues DOM-Element in HTML5, das es Benutzern ermöglicht, Grafiken direkt auf der Seite zu zeichnen, normalerweise mit JavaScript. Verschiedene Formatstandards sind beispielsweise unterschiedlich. SVG ist beispielsweise eine Raster-API (Raster-API), während VML eine Vektor-API ist. Sie können Adobe Illustrator (Vektor) zum Zeichnen und Adobe Photoshop (Raster) zum Zeichnen verwenden.

Auf der Leinwand können Sie Bilder lesen und rendern und Bilddaten über JavaScript bearbeiten. Es gibt viele vorhandene Artikel, die die grundlegende Bildverarbeitung für Sie demonstrieren und sich hauptsächlich auf verschiedene Bildfiltertechniken konzentrieren. Wir müssen jedoch lediglich das Bild skalieren und in ein bestimmtes Dateiformat konvertieren, und Canvas kann diese Aufgaben vollständig übernehmen.

Unsere angenommenen Anforderungen, z. B. dass die Bildhöhe 100 Pixel nicht überschreitet, unabhängig von der Höhe des Originalbilds. Der Grundcode lautet wie folgt:

// 参数,最大高度 
var MAX_HEIGHT = 100; 
// 渲染 
function render(src){ 
// 创建一个 Image 对象 
var image = new Image(); 
// 绑定 load 事件处理器,加载完成后执行 
image.onload = function(){ 
// 获取 canvas DOM 对象 
var canvas = document.getElementById("myCanvas"); 
// 如果高度超标 
if(image.height > MAX_HEIGHT) { 
// 宽度等比例缩放 *= 
image.width *= MAX_HEIGHT / image.height; 
image.height = MAX_HEIGHT; 
} 
// 获取 canvas的 2d 环境对象, 
// 可以理解Context是管理员,canvas是房子 
var ctx = canvas.getContext("2d"); 
// canvas清屏 
ctx.clearRect(0, 0, canvas.width, canvas.height); 
// 重置canvas宽高 
canvas.width = image.width; 
canvas.height = image.height; 
// 将图像绘制到canvas上 
ctx.drawImage(image, 0, 0, image.width, image.height); 
// !!! 注意,image 没有加入到 dom之中 
}; 
// 设置src属性,浏览器会自动加载。 
// 记住必须先绑定事件,才能设置src属性,否则会出同步问题。 
image.src = src; 
};

Im obigen Beispiel können Sie die toDataURL()-Methode von Canvas verwenden, um den Base64-codierten Wert des Bildes zu erhalten (der ebenfalls als hexadezimale Zeichenfolge verstanden werden kann). binärer Datenstrom).
Hinweis: Die von toDataURL() von Canvas erhaltene URL beginnt mit einer Zeichenfolge und enthält 22 nutzlose Daten „data:image/png;base64“, die auf dem Client oder Server gefiltert werden müssen >Solange der Browser dies unterstützt, gibt es grundsätzlich keine Begrenzung der Länge der URL-Adresse, und die Längenbeschränkung von 1024 gilt nur für die ältere IE-Generation.

Entschuldigung, wie bekommen wir die Bilder, die wir brauchen?

Guter Junge, ich freue mich, dass du gefragt hast. Sie können es nicht direkt über das Dateieingabefeld verarbeiten. Alles, was Sie von diesem Dateieingabefeldelement erhalten können, ist nur der Pfad zu der vom Benutzer ausgewählten Datei. Nach herkömmlicher Vorstellung können Sie Bilder über diese Pfadinformationen laden, dies ist jedoch im Browser unrealistisch. (Anmerkung des Übersetzers: Browserhersteller müssen sicherstellen, dass ihre Browser absolut sicher sind, um Marktanteile zu gewinnen und zumindest Medienangriffe zu vermeiden. Wenn dies zulässig ist, können bösartige URLs versuchen, durch Zusammenfügen von Dateipfaden an bestimmte vertrauliche Informationen zu gelangen.) >Um diese Anforderung zu erfüllen, können wir die Datei-API von HTML5 verwenden, um Dateien auf der Festplatte des Benutzers zu lesen und diese Datei als Quelle des Bildes (src, Quelle) zu verwenden

Einführung in die Datei-API

Die neue Datei-API-Schnittstelle ist eine Möglichkeit, Benutzerdateiverzeichnisse zu lesen und aufzulisten, ohne gegen Sicherheits-Sandbox-Regeln zu verstoßen – durch Sandbox-Einschränkungen können bösartige Websites natürlich keine Viren schreiben. Das Dateileseobjekt, das wir verwenden möchten, heißt FileReader. Mit FileReader können Entwickler den Inhalt von Dateien lesen (die Implementierung bestimmter Browser kann sehr unterschiedlich sein).

Angenommen, wir haben den Pfad der Bilddatei erhalten und uns dann auf den vorherigen Code verlassen, wird es einfach, FileReader zum Laden und Rendern des Bildes zu verwenden:

// 加载 图像文件(url路径) 
function loadImage(src){ 
// 过滤掉 非 image 类型的文件 
if(!src.type.match(/image.*/)){ 
if(window.console){ 
console.log("选择的文件类型不是图片: ", src.type); 
} else { 
window.confirm("只能选择图片文件"); 
} 
return; 
} 
// 创建 FileReader 对象 并调用 render 函数来完成渲染. 
var reader = new FileReader(); 
// 绑定load事件自动回调函数 
reader.onload = function(e){ 
// 调用前面的 render 函数 
render(e.target.result); 
}; 
// 读取文件内容 
reader.readAsDataURL(src); 
};

请问,如何获取文件呢?
小白兔,要有耐心!我们的下一步就是获取文件,当然有好多方法可以实现啦。例如:你可以用文本框让用户输入文件路径,但很显然大多数用户都不是开发者,对输入什么值根本就不了解.
为了用户使用方便,我们采用 Drag and Drop API接口。 

使用 Drag and Drop API
拖拽接口(Drag and Drop)非常简单——在大多数的DOM元素上,你都可以通过绑定事件处理器来实现. 只要用户从磁盘上拖动一个文件到dom对象上并放开鼠标,那我们就可以读取这个文件。代码如下: 

function init(){ 
// 获取DOM元素对象 
var target = document.getElementById("drop-target"); 
// 阻止 dragover(拖到DOM元素上方) 事件传递 
target.addEventListener("dragover", function(e){e.preventDefault();}, true); 
// 拖动并放开鼠标的事件 
target.addEventListener("drop", function(e){ 
// 阻止默认事件,以及事件传播 
e.preventDefault(); 
// 调用前面的加载图像 函数,参数为dataTransfer对象的第一个文件 
loadImage(e.dataTransfer.files[0]); 
}, true); 
var setheight = document.getElementById("setheight"); 
var maxheight = document.getElementById("maxheight"); 
setheight.addEventListener("click", function(e){ 
// 
var value = maxheight.value; 
if(/^\d+$/.test(value)){ 
MAX_HEIGHT = parseInt(value); 
} 
e.preventDefault(); 
},true); 
var btnsend = document.getElementById("btnsend"); 
btnsend.addEventListener("click", function(e){ 
// 
sendImage(); 
},true); 
};

我们还可以做一些其他的处理,比如显示预览图。但如果不想压缩图片的话,那很可能没什么用。我们将采用Ajax通过HTTP 的post方式上传图片数据。下面的例子是使用Dojo框架来完成请求的,当然你也可以采用其他的Ajax技术来实现.。

Dojo 代码如下:

// 译者并不懂Dojo,所以将在后面附上jQuery的实现 
// Remember that DTK 1.7+ is AMD! 
require(["dojo/request"], function(request){ 
// 设置请求URL,参数,以及回调。 
request.post("image-handler.php", { 
data: { 
imageName: "myImage.png", 
imageData: encodeURIComponent(document.getElementById("canvas").toDataURL("image/png")) 
} 
}).then(function(text){ 
console.log("The server returned: ", text); 
}); 
});

jQuery 实现如下:

// 上传图片,jQuery版 
function sendImage(){ 
// 获取 canvas DOM 对象 
var canvas = document.getElementById("myCanvas"); 
// 获取Base64编码后的图像数据,格式是字符串 
// "data:image/png;base64,"开头,需要在客户端或者服务器端将其去掉,后面的部分可以直接写入文件。 
var dataurl = canvas.toDataURL("image/png"); 
// 为安全 对URI进行编码 
// data%3Aimage%2Fpng%3Bbase64%2C 开头 
var imagedata = encodeURIComponent(dataurl); 
//var url = $("#form").attr("action"); 
// 1. 如果form表单不好处理,可以使用某个hidden隐藏域来设置请求地址 
// <input> 
var url = $("input[name='action']").val(); 
// 2. 也可以直接用某个dom对象的属性来获取 
// <input> 
// var url = $("#imageaction").attr("action"); 
// 因为是string,所以服务器需要对数据进行转码,写文件操作等。 
// 个人约定,所有http参数名字全部小写 
console.log(dataurl); 
//console.log(imagedata); 
var data = { 
imagename: "myImage.png", 
imagedata: imagedata 
}; 
jQuery.ajax( { 
url : url, 
data : data, 
type : "POST", 
// 期待的返回值类型 
dataType: "json", 
complete : function(xhr,result) { 
//console.log(xhr.responseText); 
var $tip2 = $("#tip2"); 
if(!xhr){ 
$tip2.text('网络连接失败!'); 
return false; 
} 
var text = xhr.responseText; 
if(!text){ 
$tip2.text('网络错误!'); 
return false; 
} 
var json = eval("("+text+")"); 
if(!json){ 
$tip2.text('解析错误!'); 
return false; 
} else { 
$tip2.text(json.message); 
} 
//console.dir(json); 
//console.log(xhr.responseText); 
} 
}); 
};

OK,搞定!你还需要做的,就是创建一个只管的用户界面,并允许你控制图片的大小。上传到服务器端的数据,并不需要处理enctype为 multi-part/form-data 的情况,仅仅一个简单的POST表单处理程序就可以了.
好了,下面附上完整的代码示例: 

 
 
nbsp;html> 
 
 
<title>通过Canvas及File API缩放并上传图片</title> 
<meta> 
<meta> 
<meta> 
<meta> 
<meta> 
<script></script> 
<script> 
// 参数,最大高度 
var MAX_HEIGHT = 100; 
// 渲染 
function render(src){ 
// 创建一个 Image 对象 
var image = new Image(); 
// 绑定 load 事件处理器,加载完成后执行 
image.onload = function(){ 
// 获取 canvas DOM 对象 
var canvas = document.getElementById("myCanvas"); 
// 如果高度超标 
if(image.height > MAX_HEIGHT) { 
// 宽度等比例缩放 *= 
image.width *= MAX_HEIGHT / image.height; 
image.height = MAX_HEIGHT; 
} 
// 获取 canvas的 2d 环境对象, 
// 可以理解Context是管理员,canvas是房子 
var ctx = canvas.getContext("2d"); 
// canvas清屏 
ctx.clearRect(0, 0, canvas.width, canvas.height); 
// 重置canvas宽高 
canvas.width = image.width; 
canvas.height = image.height; 
// 将图像绘制到canvas上 
ctx.drawImage(image, 0, 0, image.width, image.height); 
// !!! 注意,image 没有加入到 dom之中 
}; 
// 设置src属性,浏览器会自动加载。 
// 记住必须先绑定事件,才能设置src属性,否则会出同步问题。 
image.src = src; 
}; 
// 加载 图像文件(url路径) 
function loadImage(src){ 
// 过滤掉 非 image 类型的文件 
if(!src.type.match(/image.*/)){ 
if(window.console){ 
console.log("选择的文件类型不是图片: ", src.type); 
} else { 
window.confirm("只能选择图片文件"); 
} 
return; 
} 
// 创建 FileReader 对象 并调用 render 函数来完成渲染. 
var reader = new FileReader(); 
// 绑定load事件自动回调函数 
reader.onload = function(e){ 
// 调用前面的 render 函数 
render(e.target.result); 
}; 
// 读取文件内容 
reader.readAsDataURL(src); 
}; 
// 上传图片,jQuery版 
function sendImage(){ 
// 获取 canvas DOM 对象 
var canvas = document.getElementById("myCanvas"); 
// 获取Base64编码后的图像数据,格式是字符串 
// "data:image/png;base64,"开头,需要在客户端或者服务器端将其去掉,后面的部分可以直接写入文件。 
var dataurl = canvas.toDataURL("image/png"); 
// 为安全 对URI进行编码 
// data%3Aimage%2Fpng%3Bbase64%2C 开头 
var imagedata = encodeURIComponent(dataurl); 
//var url = $("#form").attr("action"); 
// 1. 如果form表单不好处理,可以使用某个hidden隐藏域来设置请求地址 
// <input type="hidden" name="action" value="receive.jsp" /> 
var url = $("input[name=&#39;action&#39;]").val(); 
// 2. 也可以直接用某个dom对象的属性来获取 
// <input id="imageaction" type="hidden" action="receive.jsp"> 
// var url = $("#imageaction").attr("action"); 
// 因为是string,所以服务器需要对数据进行转码,写文件操作等。 
// 个人约定,所有http参数名字全部小写 
console.log(dataurl); 
//console.log(imagedata); 
var data = { 
imagename: "myImage.png", 
imagedata: imagedata 
}; 
jQuery.ajax( { 
url : url, 
data : data, 
type : "POST", 
// 期待的返回值类型 
dataType: "json", 
complete : function(xhr,result) { 
//console.log(xhr.responseText); 
var $tip2 = $("#tip2"); 
if(!xhr){ 
$tip2.text(&#39;网络连接失败!&#39;); 
return false; 
} 
var text = xhr.responseText; 
if(!text){ 
$tip2.text(&#39;网络错误!&#39;); 
return false; 
} 
var json = eval("("+text+")"); 
if(!json){ 
$tip2.text(&#39;解析错误!&#39;); 
return false; 
} else { 
$tip2.text(json.message); 
} 
//console.dir(json); 
//console.log(xhr.responseText); 
} 
}); 
}; 
function init(){ 
// 获取DOM元素对象 
var target = document.getElementById("drop-target"); 
// 阻止 dragover(拖到DOM元素上方) 事件传递 
target.addEventListener("dragover", function(e){e.preventDefault();}, true); 
// 拖动并放开鼠标的事件 
target.addEventListener("drop", function(e){ 
// 阻止默认事件,以及事件传播 
e.preventDefault(); 
// 调用前面的加载图像 函数,参数为dataTransfer对象的第一个文件 
loadImage(e.dataTransfer.files[0]); 
}, true); 
var setheight = document.getElementById("setheight"); 
var maxheight = document.getElementById("maxheight"); 
setheight.addEventListener("click", function(e){ 
// 
var value = maxheight.value; 
if(/^\d+$/.test(value)){ 
MAX_HEIGHT = parseInt(value); 
} 
e.preventDefault(); 
},true); 
var btnsend = document.getElementById("btnsend"); 
btnsend.addEventListener("click", function(e){ 
// 
sendImage(); 
},true); 
}; 
window.addEventListener("DOMContentLoaded", function() { 
// 
init(); 
},false); 
</script> 
 
 
<p> 
</p><h1 id="通过Canvas及File-API缩放并上传图片">通过Canvas及File API缩放并上传图片</h1> 
<p>从文件夹拖动一张照片到下方的盒子里, canvas 和 JavaScript将会自动的进行缩放.</p> 
<p> 
<input> 
<button>设置图片最大高度</button> 
<input> 
</p> 
<p> 
</p><p>拖动图片文件到这里...</p> 
<p> 
</p><p> 
<button> 上 传 </button> <span></span> 
</p> 
 
<p></p><h4 id="缩略图">缩略图:</h4> 
<p> 
<canvas></canvas> 
</p> 
 
 
 

服务端页面,receive.jsp 

 
 
 
 
 
 
 
 
{ 
"message": "", 
"success":  
}

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

借助toDataURL实现将HTML5 Canvas的内容保存为图片

Das obige ist der detaillierte Inhalt vonSo zoomen und laden Sie Bilder über die Canvas- und Datei-API hoch. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme
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
Dekonstruieren von H5 -Code: Tags, Elemente und AttributeDekonstruieren von H5 -Code: Tags, Elemente und AttributeApr 18, 2025 am 12:06 AM

Der HTML5 -Code besteht aus Tags, Elementen und Attributen: 1. Das Tag definiert den Inhaltstyp und ist von Winkelklammern umgeben, wie z. 2. Elemente bestehen aus Start -Tags, Inhalten und End -Tags wie Inhalten. 3. Attribute definieren Schlüsselwertpaare im Start-Tag und verbessern Funktionen, z. B.. Dies sind die grundlegenden Einheiten zum Aufbau von Webstruktur.

H5 -Code verstehen: Die Grundlagen von HTML5H5 -Code verstehen: Die Grundlagen von HTML5Apr 17, 2025 am 12:08 AM

HTML5 ist eine Schlüsseltechnologie zum Aufbau moderner Webseiten und bietet viele neue Elemente und Funktionen. 1. HTML5 führt semantische Elemente wie usw. ein, die die Webseitenstruktur und die SEO verbessern. 2. Support Multimedia-Elemente und Einbetten von Medien ohne Plug-Ins. 3. Formulare verbessern neue Eingangstypen und Überprüfungseigenschaften und vereinfachen Sie den Überprüfungsprozess. 4. Bieten Sie Offline- und lokale Speicherfunktionen an, um die Leistung der Webseiten und die Benutzererfahrung zu verbessern.

H5 -Code: Best Practices für WebentwicklerH5 -Code: Best Practices für WebentwicklerApr 16, 2025 am 12:14 AM

Zu den Best Practices für den H5 -Code gehören: 1. Verwenden Sie korrekte DocType -Deklarationen und Zeichenkodierung; 2. Verwenden Sie semantische Tags; 3.. HTTP -Anfragen reduzieren; 4. Verwenden Sie asynchrone Laden; 5. Bilder optimieren. Diese Praktiken können die Effizienz, Wartbarkeit und Benutzererfahrung von Webseiten verbessern.

H5: Die Entwicklung von Webstandards und TechnologienH5: Die Entwicklung von Webstandards und TechnologienApr 15, 2025 am 12:12 AM

Webstandards und -technologien haben sich bisher aus HTML4, CSS2 und einfachem JavaScript entwickelt und haben erhebliche Entwicklungen erfahren. 1) HTML5 führt APIs wie Leinwand und Webstorage ein, die die Komplexität und Interaktivität von Webanwendungen verbessern. 2) CSS3 fügt Animations- und Übergangsfunktionen hinzu, um die Seite effektiver zu gestalten. 3) JavaScript verbessert die Entwicklungseffizienz und die Lesbarkeit der Code durch moderne Syntax von Node.js und ES6, wie z. B. Pfeilfunktionen und Klassen. Diese Änderungen haben die Entwicklung von Leistungsoptimierung und Best Practices von Webanwendungen gefördert.

Ist H5 eine Abkürzung für HTML5? Erforschen der DetailsIst H5 eine Abkürzung für HTML5? Erforschen der DetailsApr 14, 2025 am 12:05 AM

H5 ist nicht nur die Abkürzung von HTML5, sondern auch ein breiteres Ökosystem der modernen Webentwicklungstechnologie: 1. H5 enthält HTML5, CSS3, JavaScript und verwandte APIs und Technologien; 2. Es bietet eine reichhaltigere, interaktive und reibungslose Benutzererfahrung und kann nahtlos auf mehreren Geräten ausgeführt werden. 3. Mit dem H5 -Technologie -Stack können Sie reaktionsschnelle Webseiten und komplexe interaktive Funktionen erstellen.

H5 und HTML5: häufig verwendete Begriffe in der WebentwicklungH5 und HTML5: häufig verwendete Begriffe in der WebentwicklungApr 13, 2025 am 12:01 AM

H5 und HTML5 beziehen sich auf dasselbe, nämlich HTML5. HTML5 ist die fünfte Version von HTML, die neue Funktionen wie semantische Tags, Multimedia -Support, Leinwand und Grafiken, Offline -Speicher und lokaler Speicher bietet, die Ausdrucksfähigkeit und Interaktivität von Webseiten verbessert.

Worauf bezieht sich H5? Erforschen des KontextesWorauf bezieht sich H5? Erforschen des KontextesApr 12, 2025 am 12:03 AM

H5REFERSTOHTML5, ApivotaltechnologyInwebdevelopment.1) HTML5IntroducesNewelementsandapisrich, Dynamicwebapplications.2) ITSUPP ortsmultimediaWitHoutPlugins, BETHINGINGUSEREXPERICERCROSSDEVICES.3) SEMANTICELEMENTSIMPROVEPENTENTENTENTRUCTENTRUCTELUREANDSEO.4) H5'SRespo

H5: Tools, Frameworks und Best PracticesH5: Tools, Frameworks und Best PracticesApr 11, 2025 am 12:11 AM

Zu den Tools und Frameworks, die in der H5 -Entwicklung gemeistert werden müssen, gehören Vue.js, React und WebPack. 1.Vue.js eignet sich zum Erstellen von Benutzeroberflächen und unterstützt die Komponentenentwicklung. 2. Die Rendern des Seitenrenders über virtuelle DOM optimiert, geeignet für komplexe Anwendungen. 3.Webpack wird zur Modulverpackung und zur Optimierung der Ressourcenlast verwendet.

See all articles

Heiße KI -Werkzeuge

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.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
1 Monate vorBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
1 Monate vorBy尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. Crossplay haben?
1 Monate vorBy尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

MinGW – Minimalistisches GNU für Windows

MinGW – Minimalistisches GNU für Windows

Dieses Projekt wird derzeit auf osdn.net/projects/mingw migriert. Sie können uns dort weiterhin folgen. MinGW: Eine native Windows-Portierung der GNU Compiler Collection (GCC), frei verteilbare Importbibliotheken und Header-Dateien zum Erstellen nativer Windows-Anwendungen, einschließlich Erweiterungen der MSVC-Laufzeit zur Unterstützung der C99-Funktionalität. Die gesamte MinGW-Software kann auf 64-Bit-Windows-Plattformen ausgeführt werden.

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

WebStorm-Mac-Version

WebStorm-Mac-Version

Nützliche JavaScript-Entwicklungstools

Dreamweaver Mac

Dreamweaver Mac

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)