-1

Code work create a working base64 but when i try img.src = imgbase64; on a fly it not work, but if copy that base64 image and paste manually to src it work. IN CODE SNIPPET PRESS ON IMAGE AND UPLOAD ANY IMAGE

Question:

How to attache generated on fly image base64 string, to an html img element?

Steps:

  1. Click on any image
  2. Upload any image
  3. Then code convert you uploaded image to base64
  4. Error here, when adding base64 to src it's not working

function log(msg){return console.log(msg); } function removeClass(el, _className="active"){if(el){return hasClass(el, _className) ? el.classList.remove(_className) : true; } return false; } function hasClass(el, _className="active"){if(el.classList.contains(_className)){return true; } else {return false; } return false; } function getElement(target, targetFrom=false){return targetFrom ? targetFrom.querySelector(target) : document.querySelector(target); } function getElements(target, targetFrom=false){return targetFrom ? [...targetFrom.querySelectorAll(target)] : [...document.querySelectorAll(target)]; } function getElementById(target, targetFrom=false){return targetFrom ? targetFrom.getElementById(target) : document.getElementById(target); } function addClass(el, _className="active"){if(el){return !hasClass(el, _className) ? el.classList.add(_className) : true; } return false; } function getParent(el, idx){previouslyParent = el.parentElement; for (let index = 0; index < idx - 1; index++) {previouslyParent = previouslyParent.parentElement; } return previouslyParent; } function getOffset(el) {const rect = el.getBoundingClientRect(); return {"top": rect.top + window.scrollY, "left": rect.left + window.scrollX }; } function objectToTagStyles(selector, styles){if(styles){var style = document.createElement('style'); resonanceCssString = `${selector} {`; for (const [key, value] of Object.entries(styles)) {resonanceCssString += `${key}:${value};`; } resonanceCssString += "}"; if (style.styleSheet) {style.styleSheet.cssText = resonanceCssString; } else {style.appendChild(document.createTextNode(resonanceCssString)); } document.getElementsByTagName('head')[0].appendChild(style); return true; } return false; } function objectToCssTextStyles(styles){if(styles){resonanceCssString = ''; for (const [key, value] of Object.entries(styles)) {resonanceCssString += `${key}:${value};`; } return resonanceCssString; } return false; } function getAttribute(element, attr, isReturnValue){return isReturnValue ? element.attributes[attr].value : element.attributes[attr]; } function stringGen(yourNumber){var text = ""; var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; for (var i = 0; i < yourNumber; i++){text += possible.charAt(Math.floor(Math.random() * possible.length)); } return text; }


let base64String = "";
  
function imageUploaded() {
    var file = this['files'][0];
  
    var reader = new FileReader();
      
    reader.onload = function () {
        base64String = reader.result;
  
        imageBase64Stringsep = base64String;
  
        console.log(base64String);
    }


    imgToChange = getElement(`.change-this-image__${this.id}`);
        
    imgToChange.src = base64String;

    reader.readAsDataURL(file);
    
    return base64String;
}




imgs = getElements('img');
svgs = getElements('svg');



getElement('body').style.position = 'relative';

for(let imageElement of imgs){

    newChangeImageWrapper = document.createElement("label");
    newChangeImageInput = document.createElement("input");

    addClass(newChangeImageWrapper, 'reverb-image-changer');

    randomNewWapperId = stringGen(10);
    randomNewInputId = stringGen(10);

    currentImgOffset = getOffset(imageElement);

    addClass(newChangeImageWrapper, `reverb-image-changer--id_${randomNewWapperId}`);
    newChangeImageWrapper.setAttribute("for", randomNewInputId);

    newChangeImageInput.setAttribute("id", randomNewInputId);
    newChangeImageInput.type = "file";

    newChangeImageInput.onchange = imageUploaded;
    
    newChangeImageWrapper.appendChild(newChangeImageInput)

    addClass(imageElement, `change-this-image__${randomNewInputId}`);

    currentImageBoundaries = imageElement.getBoundingClientRect();


    currentWrapperStyles = {
        "width": `${currentImageBoundaries.width}px`,
        "height": `${currentImageBoundaries.height}px`,
        "position": "fixed",
        "top": `${currentImageBoundaries.y}px`,
        "left": `${currentImageBoundaries.x}px`
    }


    newChangeImageWrapper.style.cssText = objectToCssTextStyles(currentWrapperStyles);

    getElement('body').appendChild(newChangeImageWrapper);

}
.reverb-image-changer{
    display: block;
    border: 1px solid transparent;
    text-align: center;
    color: white;
    cursor: pointer;
    margin-top: 0;
    transition: .3s;
    z-index: 999;
}

.reverb-image-changer:hover{

    border-color: rgb(46, 204, 113);
    cursor: pointer;
}

.reverb-image-changer input{
    
    width: 0px;
    height: 0px;
  visibility: hidden;
    position: absolute;
    top: 0;
    left: -100%;

}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
    <img src="https://picsum.photos/200/300" alt="" width="200" height="300">
    <img src="https://picsum.photos/200/300" alt="" width="200" height="300">
    <img src="https://picsum.photos/200/300" alt="" width="200" height="300">
    <img src="https://picsum.photos/200/300" alt="" width="200" height="300">
  
</body>
</html>

It looks like your post is mostly code; please add some more details.

perolamutr
  • 19
  • 3
  • https://stackoverflow.com/help/minimal-reproducible-example – ericmp Sep 14 '22 at 11:04
  • 1
    Please don’t deliberately circumvent our post quality filters by copy/pasting useless text into your question. Those filters are there for a reason, and sidestepping them is really quite rude. – esqew Sep 14 '22 at 11:04
  • @esqew belive me i don't wanna it, but stack tell me add more details, but i add as much as it possible, it's just don't let me post question – perolamutr Sep 14 '22 at 11:06
  • Please trim your code to make it easier to find your problem. Follow these guidelines to create a [minimal reproducible example](https://stackoverflow.com/help/minimal-reproducible-example). – Community Sep 14 '22 at 11:12
  • _"IN CODE SNIPPET PRESS ON IMAGE"_ - and then what? What is supposed to happen? You could have added a _proper_ explanation of what your script is supposed to do, instead of adding copy&pasted stuff to the end of your question. – CBroe Sep 14 '22 at 11:34
  • @CBroe i added sir, click on image, upload your any image, and then it convert to base64 and paste on same image you chosen of 1 step. But when it past it not working, but when past the same base64 manually it work – perolamutr Sep 14 '22 at 11:35
  • Does this answer your question? [How to display Base64 images in HTML](https://stackoverflow.com/questions/8499633/how-to-display-base64-images-in-html) – Peter Krebs Sep 14 '22 at 12:29
  • Have a close look at the end of that string, it appears to have some spurious text. – A Haworth Sep 14 '22 at 12:48
  • @PeterKrebs before trying to help read closer the question, whats you shown, has no any similar things of what i need. – perolamutr Sep 14 '22 at 13:48

2 Answers2

2

You need to wait until the image was loaded.
Better change the <img> src within your onload event callback:

function imageUploaded() {
  var file = this["files"][0];
  var currentID = this.id;
  var reader = new FileReader();
  reader.onload = function () {
    base64String = reader.result;
    imageBase64Stringsep = base64String;
    imgToChange = getElement(`.change-this-image__${currentID}`);
    imgToChange.src = base64String;
  };
  reader.readAsDataURL(file);
  return base64String;
}

function log(msg) {
  return console.log(msg);
}

function removeClass(el, _className = "active") {
  if (el) {
    return hasClass(el, _className) ? el.classList.remove(_className) : true;
  }
  return false;
}

function hasClass(el, _className = "active") {
  if (el.classList.contains(_className)) {
    return true;
  } else {
    return false;
  }
  return false;
}

function getElement(target, targetFrom = false) {
  return targetFrom ?
    targetFrom.querySelector(target) :
    document.querySelector(target);
}

function getElements(target, targetFrom = false) {
  return targetFrom ?
    [...targetFrom.querySelectorAll(target)] :
    [...document.querySelectorAll(target)];
}

function getElementById(target, targetFrom = false) {
  return targetFrom ?
    targetFrom.getElementById(target) :
    document.getElementById(target);
}

function addClass(el, _className = "active") {
  if (el) {
    return !hasClass(el, _className) ? el.classList.add(_className) : true;
  }
  return false;
}

function getParent(el, idx) {
  previouslyParent = el.parentElement;
  for (let index = 0; index < idx - 1; index++) {
    previouslyParent = previouslyParent.parentElement;
  }
  return previouslyParent;
}

function getOffset(el) {
  const rect = el.getBoundingClientRect();
  return {
    top: rect.top + window.scrollY,
    left: rect.left + window.scrollX
  };
}

function objectToTagStyles(selector, styles) {
  if (styles) {
    var style = document.createElement("style");
    resonanceCssString = `${selector} {`;
    for (const [key, value] of Object.entries(styles)) {
      resonanceCssString += `${key}:${value};`;
    }
    resonanceCssString += "}";
    if (style.styleSheet) {
      style.styleSheet.cssText = resonanceCssString;
    } else {
      style.appendChild(document.createTextNode(resonanceCssString));
    }
    document.getElementsByTagName("head")[0].appendChild(style);
    return true;
  }
  return false;
}

function objectToCssTextStyles(styles) {
  if (styles) {
    resonanceCssString = "";
    for (const [key, value] of Object.entries(styles)) {
      resonanceCssString += `${key}:${value};`;
    }
    return resonanceCssString;
  }
  return false;
}

function getAttribute(element, attr, isReturnValue) {
  return isReturnValue ?
    element.attributes[attr].value :
    element.attributes[attr];
}

function stringGen(yourNumber) {
  var text = "";
  var possible =
    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
  for (var i = 0; i < yourNumber; i++) {
    text += possible.charAt(Math.floor(Math.random() * possible.length));
  }
  return text;
}

let base64String = "";

function imageUploaded() {
  var file = this["files"][0];
  var currentID = this.id;
  var reader = new FileReader();

  reader.onload = function() {
    base64String = reader.result;
    imageBase64Stringsep = base64String;
    imgToChange = getElement(`.change-this-image__${currentID}`);
    imgToChange.src = base64String;
  };
  reader.readAsDataURL(file);
  return base64String;
}

imgs = getElements("img");
svgs = getElements("svg");

getElement("body").style.position = "relative";

for (let imageElement of imgs) {
  newChangeImageWrapper = document.createElement("label");
  newChangeImageInput = document.createElement("input");

  addClass(newChangeImageWrapper, "reverb-image-changer");

  randomNewWapperId = stringGen(10);
  randomNewInputId = stringGen(10);

  currentImgOffset = getOffset(imageElement);

  addClass(
    newChangeImageWrapper,
    `reverb-image-changer--id_${randomNewWapperId}`
  );
  newChangeImageWrapper.setAttribute("for", randomNewInputId);

  newChangeImageInput.setAttribute("id", randomNewInputId);
  newChangeImageInput.type = "file";

  newChangeImageInput.onchange = imageUploaded;

  newChangeImageWrapper.appendChild(newChangeImageInput);

  addClass(imageElement, `change-this-image__${randomNewInputId}`);

  currentImageBoundaries = imageElement.getBoundingClientRect();

  currentWrapperStyles = {
    width: `${currentImageBoundaries.width}px`,
    height: `${currentImageBoundaries.height}px`,
    position: "fixed",
    top: `${currentImageBoundaries.y}px`,
    left: `${currentImageBoundaries.x}px`
  };

  newChangeImageWrapper.style.cssText = objectToCssTextStyles(
    currentWrapperStyles
  );

  getElement("body").appendChild(newChangeImageWrapper);
}
.reverb-image-changer {
  display: block;
  border: 1px solid transparent;
  text-align: center;
  color: white;
  cursor: pointer;
  margin-top: 0;
  transition: .3s;
  z-index: 999;
}

.reverb-image-changer:hover {
  border-color: rgb(46, 204, 113);
  cursor: pointer;
}

.reverb-image-changer input {
  width: 0px;
  height: 0px;
  visibility: hidden;
  position: absolute;
  top: 0;
  left: -100%;
}
<img src="https://picsum.photos/200/300" alt="" width="200" height="300">
<img src="https://picsum.photos/200/300" alt="" width="200" height="300">
<img src="https://picsum.photos/200/300" alt="" width="200" height="300">
<img src="https://picsum.photos/200/300" alt="" width="200" height="300">
herrstrietzel
  • 11,541
  • 2
  • 12
  • 34
1

imgToChange.src = base64String; needs to be inside the reader.onload function. because the base64String is empty where you are putting it right now. hope it makes sense. it would make more sense if you check it in the debugger and press F8 to watch the flow of the code.

function log(msg){return console.log(msg); } function removeClass(el, _className="active"){if(el){return hasClass(el, _className) ? el.classList.remove(_className) : true; } return false; } function hasClass(el, _className="active"){if(el.classList.contains(_className)){return true; } else {return false; } return false; } function getElement(target, targetFrom=false){return targetFrom ? targetFrom.querySelector(target) : document.querySelector(target); } function getElements(target, targetFrom=false){return targetFrom ? [...targetFrom.querySelectorAll(target)] : [...document.querySelectorAll(target)]; } function getElementById(target, targetFrom=false){return targetFrom ? targetFrom.getElementById(target) : document.getElementById(target); } function addClass(el, _className="active"){if(el){return !hasClass(el, _className) ? el.classList.add(_className) : true; } return false; } function getParent(el, idx){previouslyParent = el.parentElement; for (let index = 0; index < idx - 1; index++) {previouslyParent = previouslyParent.parentElement; } return previouslyParent; } function getOffset(el) {const rect = el.getBoundingClientRect(); return {"top": rect.top + window.scrollY, "left": rect.left + window.scrollX }; } function objectToTagStyles(selector, styles){if(styles){var style = document.createElement('style'); resonanceCssString = `${selector} {`; for (const [key, value] of Object.entries(styles)) {resonanceCssString += `${key}:${value};`; } resonanceCssString += "}"; if (style.styleSheet) {style.styleSheet.cssText = resonanceCssString; } else {style.appendChild(document.createTextNode(resonanceCssString)); } document.getElementsByTagName('head')[0].appendChild(style); return true; } return false; } function objectToCssTextStyles(styles){if(styles){resonanceCssString = ''; for (const [key, value] of Object.entries(styles)) {resonanceCssString += `${key}:${value};`; } return resonanceCssString; } return false; } function getAttribute(element, attr, isReturnValue){return isReturnValue ? element.attributes[attr].value : element.attributes[attr]; } function stringGen(yourNumber){var text = ""; var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; for (var i = 0; i < yourNumber; i++){text += possible.charAt(Math.floor(Math.random() * possible.length)); } return text; }


let base64String = "";
  
function imageUploaded() {
    var file = this['files'][0];
  
    var reader = new FileReader();
      
    reader.onload = function () {
        base64String = reader.result;
        imageBase64Stringsep = base64String;/*=====> 1.this executes after the imgTochange.src*/
        imgToChange.src = base64String;
        console.log(base64String);
    }


    imgToChange = getElement(`.change-this-image__${this.id}`);
        
    /*imgToChange.src = base64String;   =====> 1.this executes first,here base64String is empty*/ 

    reader.readAsDataURL(file);
    
    return base64String;
}




imgs = getElements('img');
svgs = getElements('svg');



getElement('body').style.position = 'relative';

for(let imageElement of imgs){

    newChangeImageWrapper = document.createElement("label");
    newChangeImageInput = document.createElement("input");

    addClass(newChangeImageWrapper, 'reverb-image-changer');

    randomNewWapperId = stringGen(10);
    randomNewInputId = stringGen(10);

    currentImgOffset = getOffset(imageElement);

    addClass(newChangeImageWrapper, `reverb-image-changer--id_${randomNewWapperId}`);
    newChangeImageWrapper.setAttribute("for", randomNewInputId);

    newChangeImageInput.setAttribute("id", randomNewInputId);
    newChangeImageInput.type = "file";

    newChangeImageInput.onchange = imageUploaded;
    
    newChangeImageWrapper.appendChild(newChangeImageInput)

    addClass(imageElement, `change-this-image__${randomNewInputId}`);

    currentImageBoundaries = imageElement.getBoundingClientRect();


    currentWrapperStyles = {
        "width": `${currentImageBoundaries.width}px`,
        "height": `${currentImageBoundaries.height}px`,
        "position": "fixed",
        "top": `${currentImageBoundaries.y}px`,
        "left": `${currentImageBoundaries.x}px`
    }


    newChangeImageWrapper.style.cssText = objectToCssTextStyles(currentWrapperStyles);

    getElement('body').appendChild(newChangeImageWrapper);

}
.reverb-image-changer{
    display: block;
    border: 1px solid transparent;
    text-align: center;
    color: white;
    cursor: pointer;
    margin-top: 0;
    transition: .3s;
    z-index: 999;
}

.reverb-image-changer:hover{

    border-color: rgb(46, 204, 113);
    cursor: pointer;
}

.reverb-image-changer input{
    
    width: 0px;
    height: 0px;
  visibility: hidden;
    position: absolute;
    top: 0;
    left: -100%;

}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
    <img src="https://picsum.photos/200/300" alt="" width="200" height="300">
    <img src="https://picsum.photos/200/300" alt="" width="200" height="300">
    <img src="https://picsum.photos/200/300" alt="" width="200" height="300">
    <img src="https://picsum.photos/200/300" alt="" width="200" height="300">
  
</body>
</html>
UmairFarooq
  • 1,269
  • 1
  • 3
  • 8