@soga/imgutils 1.3.26 → 1.3.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/main.d.mts +4 -2
- package/dist/main.d.ts +4 -2
- package/dist/main.js +1 -1
- package/dist/main.mjs +1 -1
- package/package.json +3 -3
package/dist/main.d.mts
CHANGED
|
@@ -17,10 +17,11 @@ declare class Compress {
|
|
|
17
17
|
ffmpeg_path: string;
|
|
18
18
|
});
|
|
19
19
|
protected ffmpeg(args: string[], options?: SpawnOptions): Promise<unknown>;
|
|
20
|
-
start({ input_path, output_root, output_basename, }: {
|
|
20
|
+
start({ input_path, output_root, output_basename, need_default, }: {
|
|
21
21
|
input_path: string;
|
|
22
22
|
output_root: string;
|
|
23
23
|
output_basename: string;
|
|
24
|
+
need_default: boolean;
|
|
24
25
|
}): Promise<{
|
|
25
26
|
state: boolean;
|
|
26
27
|
width: number;
|
|
@@ -33,11 +34,12 @@ declare class Compress {
|
|
|
33
34
|
private generateByFfmpeg;
|
|
34
35
|
private generateBySharp;
|
|
35
36
|
}
|
|
36
|
-
declare const compress: ({ input_path, output_basename, output_root, ffmpeg_path, }: {
|
|
37
|
+
declare const compress: ({ input_path, output_basename, output_root, ffmpeg_path, need_default, }: {
|
|
37
38
|
input_path: string;
|
|
38
39
|
output_basename: string;
|
|
39
40
|
output_root: string;
|
|
40
41
|
ffmpeg_path: string;
|
|
42
|
+
need_default: boolean;
|
|
41
43
|
}) => Promise<{
|
|
42
44
|
state: boolean;
|
|
43
45
|
width: number;
|
package/dist/main.d.ts
CHANGED
|
@@ -17,10 +17,11 @@ declare class Compress {
|
|
|
17
17
|
ffmpeg_path: string;
|
|
18
18
|
});
|
|
19
19
|
protected ffmpeg(args: string[], options?: SpawnOptions): Promise<unknown>;
|
|
20
|
-
start({ input_path, output_root, output_basename, }: {
|
|
20
|
+
start({ input_path, output_root, output_basename, need_default, }: {
|
|
21
21
|
input_path: string;
|
|
22
22
|
output_root: string;
|
|
23
23
|
output_basename: string;
|
|
24
|
+
need_default: boolean;
|
|
24
25
|
}): Promise<{
|
|
25
26
|
state: boolean;
|
|
26
27
|
width: number;
|
|
@@ -33,11 +34,12 @@ declare class Compress {
|
|
|
33
34
|
private generateByFfmpeg;
|
|
34
35
|
private generateBySharp;
|
|
35
36
|
}
|
|
36
|
-
declare const compress: ({ input_path, output_basename, output_root, ffmpeg_path, }: {
|
|
37
|
+
declare const compress: ({ input_path, output_basename, output_root, ffmpeg_path, need_default, }: {
|
|
37
38
|
input_path: string;
|
|
38
39
|
output_basename: string;
|
|
39
40
|
output_root: string;
|
|
40
41
|
ffmpeg_path: string;
|
|
42
|
+
need_default: boolean;
|
|
41
43
|
}) => Promise<{
|
|
42
44
|
state: boolean;
|
|
43
45
|
width: number;
|
package/dist/main.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var t,e=Object.create,i=Object.defineProperty,a=Object.getOwnPropertyDescriptor,o=Object.getOwnPropertyNames,u=Object.getPrototypeOf,r=Object.prototype.hasOwnProperty,p=(t,e,u,p)=>{if(e&&"object"==typeof e||"function"==typeof e)for(let n of o(e))r.call(t,n)||n===u||i(t,n,{get:()=>e[n],enumerable:!(p=a(e,n))||p.enumerable});return t},n=(t,a,o)=>(o=null!=t?e(u(t)):{},p(!a&&t&&t.__esModule?o:i(o,"default",{value:t,enumerable:!0}),t)),s={};((t,e)=>{for(var a in e)i(t,a,{get:e[a],enumerable:!0})})(s,{Combine:()=>F,Compress:()=>j,combine:()=>M,compress:()=>b,getMetadata:()=>l}),module.exports=(t=s,p(i({},"__esModule",{value:!0}),t));var h=require("image-size/fromFile"),f=n(require("sharp"));async function l(t){try{const e=await(0,f.default)(t).metadata();return{width:e.width||0,height:e.height||0,type:e.format||"unknown"}}catch(e){try{return await(0,h.imageSizeFromFile)(t)}catch(t){}}}var c=require("fs-extra"),_=require("path"),m=n(require("heic-convert")),w=require("child_process"),g=n(require("sharp")),y=require("uuid"),d=require("@soga/fileutils"),j=class{ffmpeg_path;output_root;meta;is_heic=!1;input_path="";output_filename="";constructor({ffmpeg_path:t}){this.ffmpeg_path=t}async ffmpeg(t,e){const i=this.ffmpeg_path;return await new Promise((a,o)=>{const u=(0,w.spawn)(i,t,Object.assign({stdio:"ignore"},e));u.on("close",t=>{a(t)}),u.on("error",t=>{o(t)})})}async start({input_path:t,output_root:e,output_basename:i}){const a=async()=>{const e={state:!1,width:0,height:0,output_format:"unknown",output_filename:"",output_path:""},a=t.split(".").pop()??"jpg";return e.output_filename=`${i}.${a}`,e.output_path=(0,_.join)(this.output_root,e.output_filename),e.output_format=a,await(0,c.copy)(t,e.output_path),await(0,c.exists)(e.output_path)&&(e.state=!0),e};if(this.output_root=e,this.meta=await l(t),!this.meta)return await a();const{type:o,width:u,height:r}=this.meta,p="jpg",n={state:!1,width:u,height:r,output_format:p,output_filename:`${i}.${p}`,output_path:(0,_.join)(this.output_root,`${i}.${p}`)};if("svg"==o)n.output_format="svg",n.output_filename=`${i}.svg`,n.output_path=(0,_.join)(this.output_root,n.output_filename),await(0,c.copy)(t,n.output_path),await(0,c.exists)(n.output_path)?n.state=!0:n.state=!1;else if("heic"==o||"heif"==o){const e=`${(0,y.v4)()}.png`,i=(0,_.join)(this.output_root,e),a=await(0,c.readFile)(t),o=await(0,m.default)({buffer:a,format:"PNG",quality:1});await(0,c.writeFile)(i,o);if(await(0,c.exists)(i)){const t=await this.generateFile({input_path:i,output_root:this.output_root,output_filename:n.output_filename});try{await(0,c.remove)(i)}catch(t){}n.state=t}else n.state=!1}else n.state=await this.generateFile({input_path:t,output_root:this.output_root,output_filename:n.output_filename});return n.state?n:await a()}async generateFile({input_path:t,output_root:e,output_filename:i}){const{width:a,height:o}=this.meta,u=a/o,r={width:a,height:o};if(u>1){const t=Math.min(1080,2*Math.ceil(o/2)),e=2*Math.ceil(t*u/2);r.width=e,r.height=t}else{const t=Math.min(1920,2*Math.ceil(a/2)),e=2*Math.ceil(t/u/2);r.width=t,r.height=e}return!!await this.generateBySharp({input:t,output_filename:i,output_root:e,width:r.width,height:r.height})||await this.generateByFfmpeg({input:t,output_filename:i,output_root:e,width:r.width,height:r.height})}async generateByFfmpeg({input:t,output_root:e,output_filename:i,width:a,height:o}){try{const e=["-i",t];e.push("-vf",`scale=${a}:${o}:flags=lanczos`),e.push("-y",this.output_filename),await this.ffmpeg(e,{cwd:this.output_root}),this.is_heic&&await(0,c.remove)(this.input_path)}finally{const t=(0,_.join)(e,i);return await(0,c.exists)(t)}}async generateBySharp({input:t,output_filename:e,output_root:i,width:a,height:o}){const u=(0,_.join)(i,e);try{await(0,g.default)(t).resize({width:a,height:o,fit:"inside"}).toFile(u);if(await(0,d.getFileSize)(u)>1048576){const t=(0,_.join)(i,`temp_${e}`);await(0,c.copy)(u,t),await(0,g.default)(t).jpeg({quality:70}).toFile(u)}}finally{return await(0,c.exists)(u)}}},b=async({input_path:t,output_basename:e,output_root:i,ffmpeg_path:a})=>{const o=new j({ffmpeg_path:a});return await o.start({input_path:t,output_root:i,output_basename:e})},q=require("fs-extra"),v=require("jimp"),F=class{async start({inputs:t,output_path:e,col:i,width:a,height:o}){const u=a*i,r=o*Math.ceil(t.length/i),p=new v.Jimp({width:u,height:r});for(let e=0;e<t.length;e++){const u=e%i*a,r=Math.floor(e/i)*o,n=await v.Jimp.read(t[e]);p.composite(n,u,r)}const n=await p.getBuffer("image/jpeg",{quality:70});await(0,q.writeFile)(e,n)}},M=async t=>{const e=new F;await e.start(t)};
|
|
1
|
+
var t,e=Object.create,i=Object.defineProperty,a=Object.getOwnPropertyDescriptor,A=Object.getOwnPropertyNames,o=Object.getPrototypeOf,u=Object.prototype.hasOwnProperty,n=(t,e,o,n)=>{if(e&&"object"==typeof e||"function"==typeof e)for(let g of A(e))u.call(t,g)||g===o||i(t,g,{get:()=>e[g],enumerable:!(n=a(e,g))||n.enumerable});return t},g=(t,a,A)=>(A=null!=t?e(o(t)):{},n(!a&&t&&t.__esModule?A:i(A,"default",{value:t,enumerable:!0}),t)),h={};((t,e)=>{for(var a in e)i(t,a,{get:e[a],enumerable:!0})})(h,{Combine:()=>N,Compress:()=>I,combine:()=>z,compress:()=>D,getMetadata:()=>c}),module.exports=(t=h,n(i({},"__esModule",{value:!0}),t));var p=require("image-size/fromFile"),s=g(require("sharp"));async function c(t){try{const e=await(0,s.default)(t).metadata();return{width:e.width||0,height:e.height||0,type:e.format||"unknown"}}catch(e){try{return await(0,p.imageSizeFromFile)(t)}catch(t){return{width:0,height:0,type:"unknown"}}}}var w=require("fs-extra"),r=require("path"),l=g(require("heic-convert")),b=require("child_process"),f=g(require("sharp")),m=require("uuid"),M=require("@soga/fileutils"),I=class{ffmpeg_path;output_root;meta;is_heic=!1;input_path="";output_filename="";constructor({ffmpeg_path:t}){this.ffmpeg_path=t}async ffmpeg(t,e){const i=this.ffmpeg_path;return await new Promise((a,A)=>{const o=(0,b.spawn)(i,t,Object.assign({stdio:"ignore"},e));o.on("close",t=>{a(t)}),o.on("error",t=>{A(t)})})}async start({input_path:t,output_root:e,output_basename:i,need_default:a}){const A={state:!1,width:0,height:0,output_format:"unknown",output_filename:"",output_path:""},o=async()=>{const t={state:!0,width:480,height:270,output_format:"png",output_filename:`${i}.png`,output_path:(0,r.join)(this.output_root,`${i}.png`)},e=Buffer.from("iVBORw0KGgoAAAANSUhEUgAAAeAAAAEOCAMAAABmRDRVAAAEtGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iCiAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgZXhpZjpQaXhlbFhEaW1lbnNpb249IjQ4MCIKICAgZXhpZjpQaXhlbFlEaW1lbnNpb249IjI3MCIKICAgZXhpZjpDb2xvclNwYWNlPSIxIgogICB0aWZmOkltYWdlV2lkdGg9IjQ4MCIKICAgdGlmZjpJbWFnZUxlbmd0aD0iMjcwIgogICB0aWZmOlJlc29sdXRpb25Vbml0PSIyIgogICB0aWZmOlhSZXNvbHV0aW9uPSI3Mi8xIgogICB0aWZmOllSZXNvbHV0aW9uPSI3Mi8xIgogICBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIgogICBwaG90b3Nob3A6SUNDUHJvZmlsZT0ic1JHQiBJRUM2MTk2Ni0yLjEiCiAgIHhtcDpNb2RpZnlEYXRlPSIyMDI2LTAxLTMwVDA3OjMyOjEzKzA4OjAwIgogICB4bXA6TWV0YWRhdGFEYXRlPSIyMDI2LTAxLTMwVDA3OjMyOjEzKzA4OjAwIj4KICAgPHhtcE1NOkhpc3Rvcnk+CiAgICA8cmRmOlNlcT4KICAgICA8cmRmOmxpCiAgICAgIHN0RXZ0OmFjdGlvbj0icHJvZHVjZWQiCiAgICAgIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFmZmluaXR5IFBob3RvIDEuMTAuOCIKICAgICAgc3RFdnQ6d2hlbj0iMjAyNi0wMS0zMFQwNzozMjoxMyswODowMCIvPgogICAgPC9yZGY6U2VxPgogICA8L3htcE1NOkhpc3Rvcnk+CiAgPC9yZGY6RGVzY3JpcHRpb24+CiA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgo8P3hwYWNrZXQgZW5kPSJyIj8+uJemqgAAAX9pQ0NQc1JHQiBJRUM2MTk2Ni0yLjEAACiRdZHPK0RRFMc/M4gYRrGwoCYNqyE/SmyUmYSSpjHKYDNzzQ81b7zeG0m2ynaKEhu/FvwFbJW1UkRK1rIkNug5z1MjmXO7537u955zuvdccEezSjPLu0DL5Y3ISNA3HZvxVT7hooU6vNTElakPhcPjlLS3G4kWu+qwa5WO+9dq5pOmAleV8KDSjbzwqPD4cl63eVO4UWXi88LHwgFDLih8besJhx9tTjv8YbMRjYTAXS/sS//ixC9WGUMTlpfj17JL6uc+9ks8ydzUpKytMpsxiTBCEB9jDBOij24GxPfRQQ+dsqNEftd3/gSLkqvE66xgsECaDHkCoi5J9aSsKdGTMrKs2P3/21cz1dvjVPcEoeLBsl7aoHIDPguW9b5vWZ8HUHYPZ7li/uIe9L+KXihq/l3wrsHJeVFLbMHpOjTd6XEj/i2VyXSnUvB8BLUxaLiE6lmnZz/nHN5CdFW+6gK2d6Bd4r1zXxsEZ8OuZYYFAAABg1BMVEX5+fnh4eG3t7c6Ojr19fXd3d2ZmZnLy8u8vLz9/f1sbGydnZ1HR0epqambm5uXl5c4ODjMzMxpaWns7OwVFRVlZWXBwcFqamoEBASzs7PZ2dmurq4YGBh8fHxFRUWBgYGJiYkzMzPo6OhQUFBJSUkNDQ01NTUkJCTU1NSlpaVZWVldXV2MjIzn5+fHx8dUVFR0dHR4eHhhYWGFhYUtLS0QEBAoKCggICC+vr48PDzi4uKUlJTk5ORLS0uenp7z8/Orq6vT09OxsbHq6uoDAwMaGhpXV1f7+/seHh5iYmKKiore3t5BQUFbW1sSEhIPDw/IyMi6urpMTEwAAABPT08dHR3ExMQiIiKnp6cLCwuQkJBmZmaioqLw8PA/Pz/a2tp+fn6tra02NjYwMDC5ubmSkpKOjo729vZ7e3vCwsIICAjW1tZwcHAGBgahoaEqKiqDg4POzs7R0dFzc3Nubm6GhoZDQ0MWFhYnJye1tbV3d3cuLi5TU1NfX1/v7+////8mRcn2aSDgAAAAgXRSTlP//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wCSyONPAAAACXBIWXMAAAsTAAALEwEAmpwYAAAf0ElEQVR4nO2ciV/UuBfAh0uJgAqoq+gqIijKDy9U1GUd5CqK4jEqsDrCqoCCgKCC19J//dfkJWnappleM2A+eezitNOc37yXl5eUnG1Ea8ntdAWMlFcMYM3FANZcDGDNxQDWXAxgzcUA1lwMYM3FANZcDGDNxQDWXAxgzcUA1lwMYM3FANZcDGDNxQDWXAxgzcUA1lwMYM3FANZcDGDNxQDWXAxgzcUA1lwMYM3FANZcDGDNxQDWXAxgzcUA1lwMYM3FANZcDGDNxQDWXAxgzcUA1lwMYM3FANZcDGDNxQDWXAxgzcUA1lwMYM3FANZcDGDNxQDWXAxgzcUA1lwMYM3FANZcDGDNxQDWXAxgzcUA1lwMYM3FANZcDGDNxQDWXAxgzcUA1lwMYM3FANZcDGDNxQDWXAxgzcUA1lwMYM3FANZcDGDNxQDWXAxgzcUA1lwMYM3FANZcDGDNxQDWXAxgzcUA1lwMYM3FANZcDGDNxQDWXAxgzcUA1lwMYM3FANZcDGDNxQDWXAxgzcUA1lwMYM3FANZcDGDNxQDWXAxgzcUA1lwMYM3FANZcDGDNxQDWXAxgzcUA1lwMYM3FANZcDGDNxQDWXAxgzcUA1lwMYM1lJwHnZlXf5tNmn6/eM1jm5llWtvnNTtfx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gA1iZaLKIi4PYINYmaiSiMsF2CBWJqoc4oR8IwA2iJWJKoQ4YSBLFsnKrDcqmqnuiMuqwWVrhUEco9QyAzaIlYnKjrgCgA1iZaIyI64IYINYmaisiCsE2CBWJioj4ooBNoiVicqGuIKADWJlojIhrihgg1iZqEydU1HABrEyURk6p+KADWJlosw7ZwcAG8TKRBl3zo4ANoiViTJux44ANoiViTJsx44BNoiViTJrxw4CNoiViTJqx44CNoiViTJpxw4DNoiViTJox44DNoiViVK3YxcANoiViVK2Y1cANoiViVK1Y5cANoiViVK0Y9cANoiViRK3YxcBNoiViRK2Y1cBNoiViRLms6sAG8TKRImK3mWADWJlotj57ELABrEyUcx8diVgg1iZKFY+uxSwQaxMFCOfXQvYIFYmipzPLgZsECsTRcxnVwM2iJWJIuWzywEbxMpEEfLZ9YANYmWikvn8BoANYmWiEvn8FoANYmUiZT6/CWCDWJlIkc9vA9ggViYKzec3AmwQKxOF5PNbATaIlYmk+fxmgA1iZSLprd8MsEGsTBS49RsCNoiViXy3fkvABrEykefWbwrYIFYmEm4lBvx/N3UO2khgOr0AAAAASUVORK5CYII=","base64");return await(0,w.writeFile)(t.output_path,e),await(0,w.exists)(t.output_path)?t:A};if(this.output_root=e,this.meta=await c(t),!this.meta.width||!this.meta.height)return a?await o():A;const{type:u,width:n,height:g}=this.meta,h="jpg",p={state:!1,width:n,height:g,output_format:h,output_filename:`${i}.${h}`,output_path:(0,r.join)(this.output_root,`${i}.${h}`)};if("svg"==u)p.output_format="svg",p.output_filename=`${i}.svg`,p.output_path=(0,r.join)(this.output_root,p.output_filename),await(0,w.copy)(t,p.output_path),await(0,w.exists)(p.output_path)?p.state=!0:p.state=!1;else if("heic"==u||"heif"==u){const e=`${(0,m.v4)()}.png`,i=(0,r.join)(this.output_root,e),a=await(0,w.readFile)(t),A=await(0,l.default)({buffer:a,format:"PNG",quality:1});await(0,w.writeFile)(i,A);if(await(0,w.exists)(i)){const t=await this.generateFile({input_path:i,output_root:this.output_root,output_filename:p.output_filename});try{await(0,w.remove)(i)}catch(t){}p.state=t}else p.state=!1}else p.state=await this.generateFile({input_path:t,output_root:this.output_root,output_filename:p.output_filename});return p.state?p:a?await o():A}async generateFile({input_path:t,output_root:e,output_filename:i}){const{width:a,height:A}=this.meta,o=a/A,u={width:a,height:A};if(o>1){const t=Math.min(1080,2*Math.ceil(A/2)),e=2*Math.ceil(t*o/2);u.width=e,u.height=t}else{const t=Math.min(1920,2*Math.ceil(a/2)),e=2*Math.ceil(t/o/2);u.width=t,u.height=e}return!!await this.generateBySharp({input:t,output_filename:i,output_root:e,width:u.width,height:u.height})||await this.generateByFfmpeg({input:t,output_filename:i,output_root:e,width:u.width,height:u.height})}async generateByFfmpeg({input:t,output_root:e,output_filename:i,width:a,height:A}){try{const e=["-i",t];e.push("-vf",`scale=${a}:${A}:flags=lanczos`),e.push("-y",this.output_filename),await this.ffmpeg(e,{cwd:this.output_root}),this.is_heic&&await(0,w.remove)(this.input_path)}finally{const t=(0,r.join)(e,i);return await(0,w.exists)(t)}}async generateBySharp({input:t,output_filename:e,output_root:i,width:a,height:A}){const o=(0,r.join)(i,e);try{await(0,f.default)(t).resize({width:a,height:A,fit:"inside"}).toFile(o);if(await(0,M.getFileSize)(o)>1048576){const t=(0,r.join)(i,`temp_${e}`);await(0,w.copy)(o,t),await(0,f.default)(t).jpeg({quality:70}).toFile(o)}}finally{return await(0,w.exists)(o)}}},D=async({input_path:t,output_basename:e,output_root:i,ffmpeg_path:a,need_default:A})=>{const o=new I({ffmpeg_path:a});return await o.start({input_path:t,output_root:i,output_basename:e,need_default:A})},W=require("fs-extra"),B=require("jimp"),N=class{async start({inputs:t,output_path:e,col:i,width:a,height:A}){const o=a*i,u=A*Math.ceil(t.length/i),n=new B.Jimp({width:o,height:u});for(let e=0;e<t.length;e++){const o=e%i*a,u=Math.floor(e/i)*A,g=await B.Jimp.read(t[e]);n.composite(g,o,u)}const g=await n.getBuffer("image/jpeg",{quality:70});await(0,W.writeFile)(e,g)}},z=async t=>{const e=new N;await e.start(t)};
|
package/dist/main.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{imageSizeFromFile as t}from"image-size/fromFile";import a from"sharp";async function i(i){try{const t=await a(i).metadata();return{width:t.width||0,height:t.height||0,type:t.format||"unknown"}}catch(a){try{return await t(i)}catch(t){}}}import{copy as e,exists as o,readFile as u,remove as p,writeFile as h}from"fs-extra";import{join as r}from"path";import n from"heic-convert";import{spawn as s}from"child_process";import f from"sharp";import{v4 as m}from"uuid";import{getFileSize as _}from"@soga/fileutils";var c=class{ffmpeg_path;output_root;meta;is_heic=!1;input_path="";output_filename="";constructor({ffmpeg_path:t}){this.ffmpeg_path=t}async ffmpeg(t,a){const i=this.ffmpeg_path;return await new Promise((e,o)=>{const u=s(i,t,Object.assign({stdio:"ignore"},a));u.on("close",t=>{e(t)}),u.on("error",t=>{o(t)})})}async start({input_path:t,output_root:a,output_basename:s}){const f=async()=>{const a={state:!1,width:0,height:0,output_format:"unknown",output_filename:"",output_path:""},i=t.split(".").pop()??"jpg";return a.output_filename=`${s}.${i}`,a.output_path=r(this.output_root,a.output_filename),a.output_format=i,await e(t,a.output_path),await o(a.output_path)&&(a.state=!0),a};if(this.output_root=a,this.meta=await i(t),!this.meta)return await f();const{type:_,width:c,height:w}=this.meta,l="jpg",g={state:!1,width:c,height:w,output_format:l,output_filename:`${s}.${l}`,output_path:r(this.output_root,`${s}.${l}`)};if("svg"==_)g.output_format="svg",g.output_filename=`${s}.svg`,g.output_path=r(this.output_root,g.output_filename),await e(t,g.output_path),await o(g.output_path)?g.state=!0:g.state=!1;else if("heic"==_||"heif"==_){const a=`${m()}.png`,i=r(this.output_root,a),e=await u(t),s=await n({buffer:e,format:"PNG",quality:1});await h(i,s);if(await o(i)){const t=await this.generateFile({input_path:i,output_root:this.output_root,output_filename:g.output_filename});try{await p(i)}catch(t){}g.state=t}else g.state=!1}else g.state=await this.generateFile({input_path:t,output_root:this.output_root,output_filename:g.output_filename});return g.state?g:await f()}async generateFile({input_path:t,output_root:a,output_filename:i}){const{width:e,height:o}=this.meta,u=e/o,p={width:e,height:o};if(u>1){const t=Math.min(1080,2*Math.ceil(o/2)),a=2*Math.ceil(t*u/2);p.width=a,p.height=t}else{const t=Math.min(1920,2*Math.ceil(e/2)),a=2*Math.ceil(t/u/2);p.width=t,p.height=a}return!!await this.generateBySharp({input:t,output_filename:i,output_root:a,width:p.width,height:p.height})||await this.generateByFfmpeg({input:t,output_filename:i,output_root:a,width:p.width,height:p.height})}async generateByFfmpeg({input:t,output_root:a,output_filename:i,width:e,height:u}){try{const a=["-i",t];a.push("-vf",`scale=${e}:${u}:flags=lanczos`),a.push("-y",this.output_filename),await this.ffmpeg(a,{cwd:this.output_root}),this.is_heic&&await p(this.input_path)}finally{const t=r(a,i);return await o(t)}}async generateBySharp({input:t,output_filename:a,output_root:i,width:u,height:p}){const h=r(i,a);try{await f(t).resize({width:u,height:p,fit:"inside"}).toFile(h);if(await _(h)>1048576){const t=r(i,`temp_${a}`);await e(h,t),await f(t).jpeg({quality:70}).toFile(h)}}finally{return await o(h)}}},w=async({input_path:t,output_basename:a,output_root:i,ffmpeg_path:e})=>{const o=new c({ffmpeg_path:e});return await o.start({input_path:t,output_root:i,output_basename:a})};import{writeFile as l}from"fs-extra";import{Jimp as g}from"jimp";var y=class{async start({inputs:t,output_path:a,col:i,width:e,height:o}){const u=Math.ceil(t.length/i),p=new g({width:e*i,height:o*u});for(let a=0;a<t.length;a++){const u=a%i*e,h=Math.floor(a/i)*o,r=await g.read(t[a]);p.composite(r,u,h)}const h=await p.getBuffer("image/jpeg",{quality:70});await l(a,h)}},d=async t=>{const a=new y;await a.start(t)};export{y as Combine,c as Compress,d as combine,w as compress,i as getMetadata};
|
|
1
|
+
import{imageSizeFromFile as t}from"image-size/fromFile";import i from"sharp";async function e(e){try{const t=await i(e).metadata();return{width:t.width||0,height:t.height||0,type:t.format||"unknown"}}catch(i){try{return await t(e)}catch(t){return{width:0,height:0,type:"unknown"}}}}import{copy as a,exists as A,readFile as o,remove as u,writeFile as h}from"fs-extra";import{join as g}from"path";import p from"heic-convert";import{spawn as n}from"child_process";import w from"sharp";import{v4 as c}from"uuid";import{getFileSize as s}from"@soga/fileutils";var m=class{ffmpeg_path;output_root;meta;is_heic=!1;input_path="";output_filename="";constructor({ffmpeg_path:t}){this.ffmpeg_path=t}async ffmpeg(t,i){const e=this.ffmpeg_path;return await new Promise((a,A)=>{const o=n(e,t,Object.assign({stdio:"ignore"},i));o.on("close",t=>{a(t)}),o.on("error",t=>{A(t)})})}async start({input_path:t,output_root:i,output_basename:n,need_default:w}){const s={state:!1,width:0,height:0,output_format:"unknown",output_filename:"",output_path:""},m=async()=>{const t={state:!0,width:480,height:270,output_format:"png",output_filename:`${n}.png`,output_path:g(this.output_root,`${n}.png`)},i=Buffer.from("iVBORw0KGgoAAAANSUhEUgAAAeAAAAEOCAMAAABmRDRVAAAEtGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iCiAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgZXhpZjpQaXhlbFhEaW1lbnNpb249IjQ4MCIKICAgZXhpZjpQaXhlbFlEaW1lbnNpb249IjI3MCIKICAgZXhpZjpDb2xvclNwYWNlPSIxIgogICB0aWZmOkltYWdlV2lkdGg9IjQ4MCIKICAgdGlmZjpJbWFnZUxlbmd0aD0iMjcwIgogICB0aWZmOlJlc29sdXRpb25Vbml0PSIyIgogICB0aWZmOlhSZXNvbHV0aW9uPSI3Mi8xIgogICB0aWZmOllSZXNvbHV0aW9uPSI3Mi8xIgogICBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIgogICBwaG90b3Nob3A6SUNDUHJvZmlsZT0ic1JHQiBJRUM2MTk2Ni0yLjEiCiAgIHhtcDpNb2RpZnlEYXRlPSIyMDI2LTAxLTMwVDA3OjMyOjEzKzA4OjAwIgogICB4bXA6TWV0YWRhdGFEYXRlPSIyMDI2LTAxLTMwVDA3OjMyOjEzKzA4OjAwIj4KICAgPHhtcE1NOkhpc3Rvcnk+CiAgICA8cmRmOlNlcT4KICAgICA8cmRmOmxpCiAgICAgIHN0RXZ0OmFjdGlvbj0icHJvZHVjZWQiCiAgICAgIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFmZmluaXR5IFBob3RvIDEuMTAuOCIKICAgICAgc3RFdnQ6d2hlbj0iMjAyNi0wMS0zMFQwNzozMjoxMyswODowMCIvPgogICAgPC9yZGY6U2VxPgogICA8L3htcE1NOkhpc3Rvcnk+CiAgPC9yZGY6RGVzY3JpcHRpb24+CiA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgo8P3hwYWNrZXQgZW5kPSJyIj8+uJemqgAAAX9pQ0NQc1JHQiBJRUM2MTk2Ni0yLjEAACiRdZHPK0RRFMc/M4gYRrGwoCYNqyE/SmyUmYSSpjHKYDNzzQ81b7zeG0m2ynaKEhu/FvwFbJW1UkRK1rIkNug5z1MjmXO7537u955zuvdccEezSjPLu0DL5Y3ISNA3HZvxVT7hooU6vNTElakPhcPjlLS3G4kWu+qwa5WO+9dq5pOmAleV8KDSjbzwqPD4cl63eVO4UWXi88LHwgFDLih8besJhx9tTjv8YbMRjYTAXS/sS//ixC9WGUMTlpfj17JL6uc+9ks8ydzUpKytMpsxiTBCEB9jDBOij24GxPfRQQ+dsqNEftd3/gSLkqvE66xgsECaDHkCoi5J9aSsKdGTMrKs2P3/21cz1dvjVPcEoeLBsl7aoHIDPguW9b5vWZ8HUHYPZ7li/uIe9L+KXihq/l3wrsHJeVFLbMHpOjTd6XEj/i2VyXSnUvB8BLUxaLiE6lmnZz/nHN5CdFW+6gK2d6Bd4r1zXxsEZ8OuZYYFAAABg1BMVEX5+fnh4eG3t7c6Ojr19fXd3d2ZmZnLy8u8vLz9/f1sbGydnZ1HR0epqambm5uXl5c4ODjMzMxpaWns7OwVFRVlZWXBwcFqamoEBASzs7PZ2dmurq4YGBh8fHxFRUWBgYGJiYkzMzPo6OhQUFBJSUkNDQ01NTUkJCTU1NSlpaVZWVldXV2MjIzn5+fHx8dUVFR0dHR4eHhhYWGFhYUtLS0QEBAoKCggICC+vr48PDzi4uKUlJTk5ORLS0uenp7z8/Orq6vT09OxsbHq6uoDAwMaGhpXV1f7+/seHh5iYmKKiore3t5BQUFbW1sSEhIPDw/IyMi6urpMTEwAAABPT08dHR3ExMQiIiKnp6cLCwuQkJBmZmaioqLw8PA/Pz/a2tp+fn6tra02NjYwMDC5ubmSkpKOjo729vZ7e3vCwsIICAjW1tZwcHAGBgahoaEqKiqDg4POzs7R0dFzc3Nubm6GhoZDQ0MWFhYnJye1tbV3d3cuLi5TU1NfX1/v7+////8mRcn2aSDgAAAAgXRSTlP//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wCSyONPAAAACXBIWXMAAAsTAAALEwEAmpwYAAAf0ElEQVR4nO2ciV/UuBfAh0uJgAqoq+gqIijKDy9U1GUd5CqK4jEqsDrCqoCCgKCC19J//dfkJWnappleM2A+eezitNOc37yXl5eUnG1Ea8ntdAWMlFcMYM3FANZcDGDNxQDWXAxgzcUA1lwMYM3FANZcDGDNxQDWXAxgzcUA1lwMYM3FANZcDGDNxQDWXAxgzcUA1lwMYM3FANZcDGDNxQDWXAxgzcUA1lwMYM3FANZcDGDNxQDWXAxgzcUA1lwMYM3FANZcDGDNxQDWXAxgzcUA1lwMYM3FANZcDGDNxQDWXAxgzcUA1lwMYM3FANZcDGDNxQDWXAxgzcUA1lwMYM3FANZcDGDNxQDWXAxgzcUA1lwMYM3FANZcDGDNxQDWXAxgzcUA1lwMYM3FANZcDGDNxQDWXAxgzcUA1lwMYM3FANZcDGDNxQDWXAxgzcUA1lwMYM3FANZcDGDNxQDWXAxgzcUA1lwMYM3FANZcDGDNxQDWXAxgzcUA1lwMYM3FANZcDGDNxQDWXAxgzcUA1lwMYM3FANZcDGDNxQDWXAxgzcUA1lwMYM3FANZcDGDNxQDWXAxgzcUA1lwMYM3FANZcDGDNxQDWXAxgzcUA1lwMYM1lJwHnZlXf5tNmn6/eM1jm5llWtvnNTtfx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gA1iZaLKIi4PYINYmaiSiMsF2CBWJqoc4oR8IwA2iJWJKoQ4YSBLFsnKrDcqmqnuiMuqwWVrhUEco9QyAzaIlYnKjrgCgA1iZaIyI64IYINYmaisiCsE2CBWJioj4ooBNoiVicqGuIKADWJlojIhrihgg1iZqEydU1HABrEyURk6p+KADWJlosw7ZwcAG8TKRBl3zo4ANoiViTJux44ANoiViTJsx44BNoiViTJrxw4CNoiViTJqx44CNoiViTJpxw4DNoiViTJox44DNoiViVK3YxcANoiViVK2Y1cANoiViVK1Y5cANoiViVK0Y9cANoiViRK3YxcBNoiViRK2Y1cBNoiViRLms6sAG8TKRImK3mWADWJlotj57ELABrEyUcx8diVgg1iZKFY+uxSwQaxMFCOfXQvYIFYmipzPLgZsECsTRcxnVwM2iJWJIuWzywEbxMpEEfLZ9YANYmWikvn8BoANYmWiEvn8FoANYmUiZT6/CWCDWJlIkc9vA9ggViYKzec3AmwQKxOF5PNbATaIlYmk+fxmgA1iZSLprd8MsEGsTBS49RsCNoiViXy3fkvABrEykefWbwrYIFYmEm4lBvx/N3UO2khgOr0AAAAASUVORK5CYII=","base64");return await h(t.output_path,i),await A(t.output_path)?t:s};if(this.output_root=i,this.meta=await e(t),!this.meta.width||!this.meta.height)return w?await m():s;const{type:f,width:b,height:l}=this.meta,r="jpg",I={state:!1,width:b,height:l,output_format:r,output_filename:`${n}.${r}`,output_path:g(this.output_root,`${n}.${r}`)};if("svg"==f)I.output_format="svg",I.output_filename=`${n}.svg`,I.output_path=g(this.output_root,I.output_filename),await a(t,I.output_path),await A(I.output_path)?I.state=!0:I.state=!1;else if("heic"==f||"heif"==f){const i=`${c()}.png`,e=g(this.output_root,i),a=await o(t),n=await p({buffer:a,format:"PNG",quality:1});await h(e,n);if(await A(e)){const t=await this.generateFile({input_path:e,output_root:this.output_root,output_filename:I.output_filename});try{await u(e)}catch(t){}I.state=t}else I.state=!1}else I.state=await this.generateFile({input_path:t,output_root:this.output_root,output_filename:I.output_filename});return I.state?I:w?await m():s}async generateFile({input_path:t,output_root:i,output_filename:e}){const{width:a,height:A}=this.meta,o=a/A,u={width:a,height:A};if(o>1){const t=Math.min(1080,2*Math.ceil(A/2)),i=2*Math.ceil(t*o/2);u.width=i,u.height=t}else{const t=Math.min(1920,2*Math.ceil(a/2)),i=2*Math.ceil(t/o/2);u.width=t,u.height=i}return!!await this.generateBySharp({input:t,output_filename:e,output_root:i,width:u.width,height:u.height})||await this.generateByFfmpeg({input:t,output_filename:e,output_root:i,width:u.width,height:u.height})}async generateByFfmpeg({input:t,output_root:i,output_filename:e,width:a,height:o}){try{const i=["-i",t];i.push("-vf",`scale=${a}:${o}:flags=lanczos`),i.push("-y",this.output_filename),await this.ffmpeg(i,{cwd:this.output_root}),this.is_heic&&await u(this.input_path)}finally{const t=g(i,e);return await A(t)}}async generateBySharp({input:t,output_filename:i,output_root:e,width:o,height:u}){const h=g(e,i);try{await w(t).resize({width:o,height:u,fit:"inside"}).toFile(h);if(await s(h)>1048576){const t=g(e,`temp_${i}`);await a(h,t),await w(t).jpeg({quality:70}).toFile(h)}}finally{return await A(h)}}},f=async({input_path:t,output_basename:i,output_root:e,ffmpeg_path:a,need_default:A})=>{const o=new m({ffmpeg_path:a});return await o.start({input_path:t,output_root:e,output_basename:i,need_default:A})};import{writeFile as b}from"fs-extra";import{Jimp as l}from"jimp";var r=class{async start({inputs:t,output_path:i,col:e,width:a,height:A}){const o=Math.ceil(t.length/e),u=new l({width:a*e,height:A*o});for(let i=0;i<t.length;i++){const o=i%e*a,h=Math.floor(i/e)*A,g=await l.read(t[i]);u.composite(g,o,h)}const h=await u.getBuffer("image/jpeg",{quality:70});await b(i,h)}},I=async t=>{const i=new r;await i.start(t)};export{r as Combine,m as Compress,I as combine,f as compress,e as getMetadata};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@soga/imgutils",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.27",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"tsx": "^4.20.6",
|
|
19
19
|
"@types/heic-convert": "^2.1.0",
|
|
20
20
|
"terser": "^5.43.1",
|
|
21
|
-
"@soga/typescript-config": "1.3.
|
|
21
|
+
"@soga/typescript-config": "1.3.27"
|
|
22
22
|
},
|
|
23
23
|
"keywords": [],
|
|
24
24
|
"author": "",
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"heic-convert": "^2.1.0",
|
|
31
31
|
"image-size": "^2.0.2",
|
|
32
32
|
"sharp": "^0.34.5",
|
|
33
|
-
"@soga/fileutils": "1.3.
|
|
33
|
+
"@soga/fileutils": "1.3.27"
|
|
34
34
|
},
|
|
35
35
|
"scripts": {
|
|
36
36
|
"demo": "tsx ./demo/demo",
|