{
"$type": "site.standard.document",
"bskyPostRef": {
"cid": "bafyreigeicysw36dpq3aifwtz5pfqg57yh22y75lvna4drie7htwx7kexe",
"uri": "at://did:plc:hqad6xwuzg7oqfmwylfkvqfm/app.bsky.feed.post/3mogxz2ebj4u2"
},
"path": "/viewtopic.php?t=33521&p=275694#p275694",
"publishedAt": "2026-06-16T21:50:53.000Z",
"site": "http://forum.palemoon.org",
"tags": [
"https://artsandculture.google.com/",
"https://artsandculture.google.com/asset/napoleon-crossing-the-alps-paul-delaroche/cwF8_mSi8tlbXw",
"https://forum.palemoon.org/viewtopic.php?f=71&t=32626",
"https://artsandculture.google.com/asset ... _mSi8tlbXw",
"@mozilla.org"
],
"textContent": "> On the https://artsandculture.google.com/ link, if you disable JavaScript, you'll get a (far lessor quality) .jpg (that you can save, directly).\n>\n> If you disable styles; View | Page Style - No Style, you can more easily _see_ the \"blobs\".\n>\n> Developer Tools, Options, Toolbox Buttons, if you enable 'Take a screenshot of the entire page', that will create a decent quality image, but not of the entire page (as it says), but only of the current view.\n>\n>\n> Bookmarklets (at least the ones I've looked at), & window.oncontextmenu = null;, do not seem to help any.\n\nThe image generated by combining \"blob\" URLs can be saved even at maximum resolution. To save the image found on the page with the URL https://artsandculture.google.com/asset/napoleon-crossing-the-alps-paul-delaroche/cwF8_mSi8tlbXw I created a Custom Button:\n\n\nCODE:\n\n\n /* Initialization Code *//* HELP1. Ctrl + Click on Button = Save the parameters of the partial image tag with \"blob\" URL to a variable, after maximizing the image.IMPORTANT: This step must be repeated for each new partial image obtained by scrolling the previous partial image, until every portion of the full image is displayed( see the screenshots below, which show the first and last partial images parameters being saved ).2. Alt + Click on Button = Save partial images in \"base64\" format to an array ( converted from the \"blobs\" retrieved with XMLHttpRequest ),remove duplicates and sort them in the correct order, then displays the mix of partial images in a new tab.This mix of partial images can be saved to disk as a single file containing the entire image( using an add-on that takes a screenshot of the entire page ).3. Ctrl + Shift on Button = Reset the variables used in the code before running this Custom Button to capture another image that uses \"blob\" URLs.IMPORTANT: There is a variable in the code ( var blob_image_width = 512; ) whose value ( 512px ) I took from the HTML code of the pagehttps://artsandculture.google.com/asset/napoleon-crossing-the-alps-paul-delaroche/cwF8_mSi8tlbXw AFTER I maximized the size of the partial image ( 100% ).This value must be adjusted on a case-by-case basis.*/var prompts__for_save_blob_images = Components.classes[\"@mozilla.org/embedcomp/prompt-service;1\"].getService(Components.interfaces.nsIPromptService);var blob_image_width = 512;var arr_blob_images_parameters = [];var arr_blob_Images_in_base64_Format = [];var get_unique_elements_from_array__for_save_blob_images = arr => { var arrStr = arr.map(item => JSON.stringify(item)); return [...new Set(arrStr)].map(item => JSON.parse(item))}function get_transform_translate3d_values(el){var values = el.style.transform.split(/\\w+\\(|\\);?/);if(!values[1] || !values[1].length){return [];}return values[1].split(/,\\s?/g);}function get_all_blob_image_objects_and_URLs_from_page(){var arr_images = content.document.querySelectorAll(\"img[src*='blob']\");for(var i=0; i<arr_images.length; i++){var image = arr_images[i];if(image.width){if(image.width == blob_image_width){if(image.src){var img_URL = image.src;// var img_width = blob_image_width;var img_height;if(image.height){img_height = image.height;} else{img_height = blob_image_width;}var int_tx;var int_ty;if(image.style.transform.includes(\"translate3d\")){var arr_translate3d_values = get_transform_translate3d_values(image);if(!arr_translate3d_values.length == 0){var regEx = /(-*[\\d\\.]*)/;if(arr_translate3d_values[0]){var str_tx = arr_translate3d_values[0].match(regEx);if(str_tx){int_tx = parseInt(str_tx);}}if(arr_translate3d_values[1]){var str_ty = arr_translate3d_values[1].match(regEx);if(str_ty){int_ty = parseInt(str_ty);}}}var arr_temp = [int_ty, int_tx, img_height, img_URL];arr_blob_images_parameters.push(arr_temp);} else{int_tx = 0;int_ty = 0;var arr_temp = [int_ty, int_tx, img_height, img_URL];arr_blob_images_parameters.push(arr_temp);}}if(i == arr_images.length - 1){prompts__for_save_blob_images.alert(null, 'Save Partial Images Parameters to Array', 'Saving Partial Image Parameters to Array is Complete');}}}}}function get_image_in_blob_format_with_XMLHttpRequest(img_URL) {var xhr = new XMLHttpRequest();xhr.onreadystatechange = function() {if (this.readyState == 4 && this.status == 200) {var contentType;var img_blob;get_response();async function get_response() {for (var i = 0; i < 1; i++) {contentType = xhr.getResponseHeader('Content-Type');img_blob = xhr.response;if(img_blob){get_base64_image_from_image_blob_format_and_save_base64_to_array(img_blob, contentType);break;} else{await new Promise(resolve => setTimeout(resolve, 2000));}}}}};xhr.open(\"GET\", img_URL, true);xhr.responseType = \"blob\";xhr.send();}function get_base64_image_from_image_blob_format_and_save_base64_to_array(img_blob, contentType) {try{var blobToBase64 = function(blob, cb) {var reader = new FileReader();reader.onload = function() {var dataUrl = reader.result;var base64 = dataUrl.split(',')[1];cb(base64);}reader.readAsDataURL(blob);};blobToBase64(img_blob, function(base64) {var base64_Image = \"data:\" + contentType + \";base64,\" + base64;arr_blob_Images_in_base64_Format.push(base64_Image);});} catch(err){// alert(err.message);}}this.buttonClick___get_the_image_generated_with_blob_URLs_and_display_it_in_a_new_tab = function(event){if(event.button == 0 && event.ctrlKey && !event.altKey && !event.shiftKey){get_all_blob_image_objects_and_URLs_from_page();}if(event.button == 0 && event.altKey && !event.ctrlKey && !event.shiftKey){var arr_blob_images_parameters__unique_elements = get_unique_elements_from_array__for_save_blob_images(arr_blob_images_parameters);var arr_blob_images_parameters__unique_elements__sorted = arr_blob_images_parameters__unique_elements.sort( function (a,b) {if (a[0] > b[0]) return 1;if (a[0] < b[0]) return -1;if (a[1] > b[1]) return 1;if (a[1] < b[1]) return -1;return 0;});var previous_int_ty = arr_blob_images_parameters__unique_elements__sorted[0][0];var number_of_rows = 1;var total_height = previous_int_ty = arr_blob_images_parameters__unique_elements__sorted[0][2];for(var i=0; i<arr_blob_images_parameters__unique_elements__sorted.length; i++){var arr_image_parameters = arr_blob_images_parameters__unique_elements__sorted[i];var current_int_ty = arr_image_parameters[0];if(current_int_ty != previous_int_ty){number_of_rows = number_of_rows + 1;var img_height = arr_image_parameters[2];total_height = total_height + img_height;}var img_URL = arr_image_parameters[3];get_image_in_blob_format_with_XMLHttpRequest(img_URL);if(i == arr_blob_images_parameters__unique_elements__sorted.length - 1){prompts__for_save_blob_images.alert(null, 'Save Partial Images to Array in \"base64\" Format', 'Saving Partial Images to Array in \"base64\" Format is Complete');var html = '<html><head><meta charset=\"utf-8\"></head><body></body></html>';var page_URL = \"data:text/html,\" + encodeURIComponent(html);var final_position = gBrowser.tabContainer.selectedIndex + 1;var new_tab = gBrowser.addTab(page_URL);gBrowser.moveTabTo(new_tab, final_position);gBrowser.selectedTab = new_tab;setTimeout(function() {try{var body = content.document.getElementsByTagName(\"body\")[0];for(var j=0; j<arr_blob_Images_in_base64_Format.length; j++){var img_tag = content.document.createElement(\"img\");img_tag.src = arr_blob_Images_in_base64_Format[j];img_tag.style.width = blob_image_width;body.appendChild(img_tag);}var number_of_images_per_row = arr_blob_Images_in_base64_Format.length / number_of_rows;var page_width = number_of_images_per_row * blob_image_width;setTimeout(function() {var final_body = content.document.getElementsByTagName(\"body\")[0];final_body.style.cssText = \"width: 2048px; margin: 0px; padding: 0px;\";}, 100);} catch(err){// alert(err.message);}}, 1000);}}}if(event.button == 0 && event.shiftKey && !event.ctrlKey && !event.altKey){arr_blob_Images_in_base64_Format.length = 0;arr_blob_images_parameters.length = 0;prompts__for_save_blob_images.alert(null, 'Reset Arrays', 'The Reset of Arrays used in the last session is Complete');}}this.setAttribute(\"onclick\", \"this.buttonClick___get_the_image_generated_with_blob_URLs_and_display_it_in_a_new_tab(event)\");this.name = '\\n Capture at Maximum Resolution the Image generated from the mix of \"blob\" URLs \\n\\n • Display the Resulting Image in a new TAB \\n ';this.image = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACDklEQVQ4jYWRMWgTURjHP0iGgEugFRwEMzgILknve6ggePceJQ5qknfdOmRwcLODxSVDIiZ26JAhTW88sZh7g1IxoNLe5pDB0cHxBpH27oIBkxjICc/hcimGa/zgWz7e//f//u8DWKisWUyjpRuKxX0UPEBL/4KCP1p8F1tK5/6qIriDQpeLvSZKlf8CUPDmTHBCXpc2c68eIFq6Ec54oJj6teUbWLqDQpdKp1T+d857M/DyLbJmMbP3eJ39WMeWy0jP18gdAADscAuFLhVL310K8ChWPIqBx4j0GJGn2o1C7i2/ogh9iEKXRJQ2zxX7THkSCV2Gnz1Gtjba9wxF8EHozp2MqabindXrl1xKJh4j0qPKzjy74Icz8besWcyc6+7O3F1Kvt59dspoY1yljXH1lmG0UGwU1JqaXJrdZ3jgMSJ9SnbVmpPS6qOPtDGSWn000RqjPACArEHyj50oR/2rC6tnERha4frkOQBAHGRwCOnATsqop0eQPYtAsRp+HulFs0WI+bLSnIknUzth/v4Al+eA7+raVY+S8HyqUo6D5F/0Ze9NXk7thBV/CYrN+RkpGn0txwbtdHbw6eLW0713MoJst94/jAU4aiblUnIQQTxG5Hh/RQZ2Uo6PLsjtVjdY/NjY6mtY8BkeuwyH4/ZKMLUTTnCc3OlZNzO0PupqjeFAqw9P1PrP2wAAfwEpM0QpeBBBmQAAAABJRU5ErkJggg==\";\n\n**Note:** The code above must be copied into the \"Initialization Code\" TAB in Custom Button ( https://forum.palemoon.org/viewtopic.php?f=71&t=32626 ), and Pale Moon must be restarted before using this button.\n\nIMPORTANT: There is a variable in the code ( var blob_image_width = 512; ) whose value ( 512px ) I took from the HTML code of the page https://artsandculture.google.com/asset ... _mSi8tlbXw AFTER I maximized the size of the partial image ( 100% ). This value must be adjusted on a case-by-case basis.\n\n**HELP:**\n\n1. Ctrl + Click on Button = Save the parameters of the partial image tag with \"blob\" URL to a variable, after maximizing the image.\n\nIMPORTANT: This step must be repeated for each new partial image obtained by scrolling the previous partial image, until every portion of the full image is displayed ( see the screenshots below, which show the first and last partial images parameters being saved ).\n\n2. Alt + Click on Button = Save partial images in \"base64\" format to an array ( converted from the \"blobs\" retrieved with XMLHttpRequest ), remove duplicates and sort them in the correct order, then displays the mix of partial images in a new tab. This mix of partial images can be saved to disk as a single file containing the entire image ( using an add-on that takes a screenshot of the entire page ).\n\n3. Ctrl + Shift on Button = Reset the variables used in the code before running this Custom Button to capture another image that uses \"blob\" URLs.\n\n**Screenshots:**\n\n\n* * *",
"title": "Add-ons • Re: is there an addon to rip content protected images?",
"updatedAt": "2026-06-16T22:45:05.000Z"
}