এইচটিএমএল ক্যানভাসে চিত্র বা পিডিএফ হিসাবে প্রদর্শিত যা ক্যাপচার বা মুদ্রণ করা সম্ভব?
আমি ক্যানভাসের মাধ্যমে একটি চিত্র তৈরি করতে চাই এবং সেই চিত্র থেকে একটি পিএনজি উত্পন্ন করতে সক্ষম হব।
এইচটিএমএল ক্যানভাসে চিত্র বা পিডিএফ হিসাবে প্রদর্শিত যা ক্যাপচার বা মুদ্রণ করা সম্ভব?
আমি ক্যানভাসের মাধ্যমে একটি চিত্র তৈরি করতে চাই এবং সেই চিত্র থেকে একটি পিএনজি উত্পন্ন করতে সক্ষম হব।
উত্তর:
উফ। মূল উত্তর একই ধরণের প্রশ্নের সাথে নির্দিষ্ট ছিল। এটি সংশোধিত হয়েছে:
var canvas = document.getElementById("mycanvas");
var img = canvas.toDataURL("image/png");
আইএমজির মান সহ আপনি এটি নতুন চিত্র হিসাবে লিখতে পারেন:
document.write('<img src="'+img+'"/>');
var img = new Image(); img.src = canvas.toDataURL(); document.body.appendChild(img);
। document.write
কোড, ডেটা URL টি করছে তাদের একটি এইচটিএমএল স্ট্রিং উপার্জন, তারপর DOM মধ্যে যে স্ট্রিং এর একটি কপি নির্বাণ, ব্রাউজার তারপর যে এইচটিএমএল স্ট্রিং বিশ্লেষণ করতে, ইমেজ উপাদান আরেকটি কপি করা, তারপর আবার চালু করতে এটি পার্স হয়েছে চিত্রের ডেটাতে ডেটা ইউআরএল, তারপরে শেষ পর্যন্ত এটি চিত্রটি দেখাতে পারে। স্ক্রিন আকারের চিত্রের জন্য এটি বিশাল পরিমাণের মেমরি / অনুলিপি / পার্সিং করছে। স্রেফ একটি পরামর্শ
এইচটিএমএল 5 ক্যানভাস.টোডেটাআরএল (মাইমেটাইপ) সরবরাহ করে যা অপেরা, ফায়ারফক্স এবং সাফারি 4 বিটাতে প্রয়োগ করা হয়। নিরাপত্তা সংক্রান্ত বেশ কয়েকটি বিধিনিষেধ রয়েছে, তবে (বেশিরভাগ ক্ষেত্রে অন্য কোনও উত্স থেকে ক্যানভাসে আঁকতে হবে)।
সুতরাং আপনার অতিরিক্ত লাইব্রেরি লাগবে না।
যেমন
<canvas id=canvas width=200 height=200></canvas>
<script>
window.onload = function() {
var canvas = document.getElementById("canvas");
var context = canvas.getContext("2d");
context.fillStyle = "green";
context.fillRect(50, 50, 100, 100);
// no argument defaults to image/png; image/jpeg, etc also work on some
// implementations -- image/png is the only one that must be supported per spec.
window.location = canvas.toDataURL("image/png");
}
</script>
তাত্ত্বিকভাবে এটির মাঝখানে সবুজ বর্গক্ষেত্র সহ একটি চিত্র তৈরি এবং তারপরে নেভিগেট করা উচিত, তবে আমি পরীক্ষা করিনি।
javascript:void(window.open().location = document.getElementsByTagName("canvas")[0].toDataURL("image/png"))
আমি ভেবেছিলাম যে আমি এই বিষয়ে কিছু কার্যকর টিডবিট দিয়ে এই প্রশ্নের পরিধিটি কিছুটা বাড়িয়ে দেব।
একটি চিত্র হিসাবে ক্যানভাস পেতে, আপনার নিম্নলিখিত করা উচিত:
var canvas = document.getElementById("mycanvas");
var image = canvas.toDataURL("image/png");
আপনি পৃষ্ঠাতে চিত্রটি লিখতে এটি ব্যবহার করতে পারেন:
document.write('<img src="'+image+'"/>');
যেখানে "ইমেজ / পিএনজি" হ'ল মাইম টাইপ (পিএনজি হ'ল একমাত্র এটি সমর্থনযোগ্য)। আপনি যদি সমর্থিত ধরণের একটি অ্যারে চান তবে আপনি এর লাইন বরাবর কিছু করতে পারেন:
var imageMimes = ['image/png', 'image/bmp', 'image/gif', 'image/jpeg', 'image/tiff']; //Extend as necessary
var acceptedMimes = new Array();
for(i = 0; i < imageMimes.length; i++) {
if(canvas.toDataURL(imageMimes[i]).search(imageMimes[i])>=0) {
acceptedMimes[acceptedMimes.length] = imageMimes[i];
}
}
আপনার প্রতি পৃষ্ঠায় এটি একবার চালানো দরকার - এটি কোনও পৃষ্ঠার জীবনচক্রের মাধ্যমে কখনও পরিবর্তন হওয়া উচিত নয়।
আপনি যদি ব্যবহারকারীটিকে ফাইলটি সেভ হিসাবে ডাউনলোড করতে চান তবে আপনি নিম্নলিখিতটি করতে পারেন:
var canvas = document.getElementById("mycanvas");
var image = canvas.toDataURL("image/png").replace("image/png", "image/octet-stream"); //Convert image to 'octet-stream' (Just a download, really)
window.location.href = image;
আপনি যদি এটি বিভিন্ন মাইম প্রকারের সাথে ব্যবহার করে থাকেন তবে চিত্র / পিএনজি উভয় উদাহরণ পরিবর্তন করতে ভুলবেন না, তবে চিত্র / অক্টেট-স্ট্রিম নয়। এটিও উল্লেখযোগ্য যে আপনি যদি আপনার ক্যানভাস সরবরাহ করতে কোনও ক্রস-ডোমেন সংস্থান ব্যবহার করেন, আপনি যখন ডেটাআরল পদ্ধতিটি ব্যবহার করার চেষ্টা করবেন তখন আপনি একটি সুরক্ষা ত্রুটির মুখোমুখি হবেন।
function exportCanvasAsPNG(id, fileName) {
var canvasElement = document.getElementById(id);
var MIME_TYPE = "image/png";
var imgURL = canvasElement.toDataURL(MIME_TYPE);
var dlLink = document.createElement('a');
dlLink.download = fileName;
dlLink.href = imgURL;
dlLink.dataset.downloadurl = [MIME_TYPE, dlLink.download, dlLink.href].join(':');
document.body.appendChild(dlLink);
dlLink.click();
document.body.removeChild(dlLink);
}
আমি " wkhtmltopdf " ব্যবহার করব । এটা ঠিক দুর্দান্ত কাজ। এটি ওয়েবকিট ইঞ্জিন (ক্রোম, সাফারি ইত্যাদিতে ব্যবহৃত) ব্যবহার করে এবং এটি ব্যবহার করা খুব সহজ:
wkhtmltopdf stackoverflow.com/questions/923885/ this_question.pdf
এটাই!
আপনি যদি কোনও সার্ভারের মাধ্যমে ডাউনলোডটি করেন তবে এখানে কিছু সহায়তা দেওয়া হয়েছে (আপনি নিজের ফাইলটির নাম / রূপান্তর / পোস্ট-প্রক্রিয়া / ইত্যাদি করতে পারেন):
পোষ্ট ডেটা ব্যবহার করে toDataURL
- শিরোনামগুলি সেট করুন
$filename = "test.jpg"; //or png
header('Content-Description: File Transfer');
if($msie = !strstr($_SERVER["HTTP_USER_AGENT"],"MSIE")==false)
header("Content-type: application/force-download");else
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"$filename\"");
header("Content-Transfer-Encoding: binary");
header("Expires: 0"); header("Cache-Control: must-revalidate");
header("Pragma: public");
চিত্র তৈরি করুন
$data = $_POST['data'];
$img = imagecreatefromstring(base64_decode(substr($data,strpos($data,',')+1)));
- জেপিজি হিসাবে চিত্র রফতানি করুন
$width = imagesx($img);
$height = imagesy($img);
$output = imagecreatetruecolor($width, $height);
$white = imagecolorallocate($output, 255, 255, 255);
imagefilledrectangle($output, 0, 0, $width, $height, $white);
imagecopy($output, $img, 0, 0, 0, 0, $width, $height);
imagejpeg($output);
exit();
imagesavealpha($img, true);
imagepng($img);
die($img);
আর একটি আকর্ষণীয় সমাধান হ'ল ফ্যান্টমজেএস । এটি জাভাস্ক্রিপ্ট বা কফিস্ক্রিপ্ট সহ একটি মাথাবিহীন ওয়েবকিট স্ক্রিপ্টযোগ্য।
ব্যবহারের কেসগুলির মধ্যে একটি হ'ল স্ক্রিন ক্যাপচার: আপনি এসভিজি এবং ক্যানভাস এবং / অথবা থাম্বনেইল পূর্বরূপ সহ ওয়েব সাইটের স্ক্রিনশট তৈরি করতে প্রোগ্রামগতভাবে ওয়েব সামগ্রীগুলি ক্যাপচার করতে পারেন।
সেরা এন্ট্রি পয়েন্ট হ'ল স্ক্রিন ক্যাপচার উইকি পৃষ্ঠা।
পোলার ঘড়ির জন্য এখানে একটি ভাল উদাহরণ (রাফেলজেএস থেকে):
>phantomjs rasterize.js http://raphaeljs.com/polar-clock.html clock.png
আপনি কি কোনও পিডিএফ-তে কোনও পৃষ্ঠা রেন্ডার করতে চান?
> phantomjs rasterize.js 'http://en.wikipedia.org/w/index.php?title=Jakarta&printable=yes' jakarta.pdf
আপনি যদি jQuery ব্যবহার করে থাকেন, যা প্রচুর পরিমাণে লোকেরা করে থাকে তবে আপনি গ্রহণযোগ্য উত্তরটি এভাবে প্রয়োগ করবেন:
var canvas = $("#mycanvas")[0];
var img = canvas.toDataURL("image/png");
$("#elememt-to-write-to").html('<img src="'+img+'"/>');
.toDataURL
নেটিভ জেএস।
$('<img>').attr('src',$('#mycanvas')[0].toDataURL('image/png')).appendTo($('#element-to-write-to').empty());
ঠিক এক লাইন।
আপনি এই জাতীয় চিত্র বা পিডিএফ-তে ক্যানভাস ক্যাপচার করতে jspdf ব্যবহার করতে পারেন:
var imgData = canvas.toDataURL('image/png');
var doc = new jsPDF('p', 'mm');
doc.addImage(imgData, 'PNG', 10, 10);
doc.save('sample-file.pdf');
আরও তথ্য: https://github.com/MrRio/jsPDF
এটি স্ট্রিং ছাড়াই অন্যভাবে, যদিও আমি দ্রুত জানি না যে এটি দ্রুত বা না। টুডাআরএল এর পরিবর্তে (এখানে সমস্ত প্রশ্নের প্রস্তাব হিসাবে)। আমার ক্ষেত্রে ডেটা ইউআরএল / বেস 64 প্রতিরোধ করতে চাই যেহেতু আমার কাছে অ্যারে বাফার বা ভিউ দরকার। এইচটিএমএল ক্যানভাস এলিমেন্টে অন্য পদ্ধতিটি toBlob
। (টাইপস্ক্রিপ্ট ফাংশন):
export function canvasToArrayBuffer(canvas: HTMLCanvasElement, mime: string): Promise<ArrayBuffer> {
return new Promise((resolve, reject) => canvas.toBlob(async (d) => {
if (d) {
const r = new FileReader();
r.addEventListener('loadend', e => {
const ab = r.result;
if (ab) {
resolve(ab as ArrayBuffer);
}
else {
reject(new Error('Expected FileReader result'));
}
}); r.addEventListener('error', e => {
reject(e)
});
r.readAsArrayBuffer(d);
}
else {
reject(new Error('Expected toBlob() to be defined'));
}
}, mime));
}
ব্লবগুলির আর একটি সুবিধা হ'ল এইচটিএমএলপুটফাইলে 'ফাইলস' সদস্যের মতো ফাইল হিসাবে ডেটা উপস্থাপন করতে আপনি অবজেক্টআরলস তৈরি করতে পারেন। অধিক তথ্য:
https://developer.mozilla.org/es/docs/Web/API/HTMLCanvasElement/toBlob