add very simple white bg remover

This commit is contained in:
NilsUeter
2025-03-01 13:19:38 +01:00
parent 2cb73c7680
commit b089ba7eaf
+50
View File
@@ -92,6 +92,7 @@ const Unit = ({
} = unit; } = unit;
const [image, setImage] = useLocalStorage("image" + name); const [image, setImage] = useLocalStorage("image" + name);
const hasImage = image && image !== "undefined"; const hasImage = image && image !== "undefined";
const [bgRemoved, setBgRemoved] = useState(false);
const weapons = [...meleeWeapons, ...rangedWeapons]; const weapons = [...meleeWeapons, ...rangedWeapons];
@@ -163,6 +164,33 @@ const Unit = ({
.replace(")", ""); .replace(")", "");
} }
const removeWhiteBackground = (imageSrc) => {
return new Promise((resolve) => {
const img = new Image();
img.crossOrigin = "Anonymous";
img.src = imageSrc;
img.onload = () => {
const canvas = document.createElement("canvas");
const ctx = canvas.getContext("2d");
canvas.width = img.width;
canvas.height = img.height;
ctx.drawImage(img, 0, 0);
const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
const data = imageData.data;
for (let i = 0; i < data.length; i += 4) {
if (data[i] > 240 && data[i + 1] > 240 && data[i + 2] > 240) {
data[i + 3] = 0; // Set alpha to 0
}
}
ctx.putImageData(imageData, 0, 0);
resolve(canvas.toDataURL());
};
});
};
return ( return (
<div <div
className={ className={
@@ -345,6 +373,26 @@ const Unit = ({
/> />
)} )}
<div className="absolute right-[1px] top-[2px] flex gap-1"> <div className="absolute right-[1px] top-[2px] flex gap-1">
{hasImage && !bgRemoved && (
<button
className="button print-display-none"
style={{
border: "1px solid #999",
padding: "1px 4px",
fontSize: "0.8rem",
backgroundColor: "#f0f0f0",
}}
onClick={async () => {
// reset uploadRef
uploadRef.current.value = "";
const resultUrl = await removeWhiteBackground(image);
setImage(resultUrl);
setBgRemoved(true);
}}
>
Remove white from image
</button>
)}
<label <label
className="button print-display-none" className="button print-display-none"
style={{ style={{
@@ -367,6 +415,7 @@ const Unit = ({
let reader = new FileReader(); let reader = new FileReader();
reader.onload = function (ev) { reader.onload = function (ev) {
setImage(ev.target.result); setImage(ev.target.result);
setBgRemoved(false);
}.bind(this); }.bind(this);
reader.readAsDataURL(e.target.files[0]); reader.readAsDataURL(e.target.files[0]);
} }
@@ -388,6 +437,7 @@ const Unit = ({
}} }}
onClick={() => { onClick={() => {
setImage(undefined); setImage(undefined);
setBgRemoved(false);
}} }}
> >
Clear image Clear image