mirror of
https://github.com/obsidian-desci/Obsidian-Desci.git
synced 2026-07-22 08:50:32 +00:00
png buffer to canvas
This commit is contained in:
parent
2c18efbba1
commit
04b5041954
4 changed files with 133 additions and 7 deletions
48
api/index.js
48
api/index.js
|
|
@ -22,6 +22,45 @@ import { sha256 } from 'multiformats/hashes/sha2'
|
|||
|
||||
import { toString as stringFromUint8Array } from 'uint8arrays/to-string'
|
||||
import {initLibp2p} from './kubo.js'
|
||||
|
||||
import { Readable } from 'stream';
|
||||
import { PNG } from 'pngjs';
|
||||
import streamToBuffer from 'stream-to-buffer';
|
||||
import * as webStreamsNode from 'web-streams-node';
|
||||
|
||||
async function convertToPng(readableStream, outputPath) {
|
||||
const png = new PNG();
|
||||
|
||||
// Create a reader for the ReadableStream
|
||||
const reader = readableStream.getReader();
|
||||
|
||||
// Accumulate the chunks into a buffer
|
||||
const chunks = [];
|
||||
while (true) {
|
||||
const { done, value } = await reader.read();
|
||||
if (done) break;
|
||||
chunks.push(value);
|
||||
}
|
||||
const buffer = Buffer.concat(chunks);
|
||||
|
||||
// Parse the buffer as a PNG image
|
||||
png.parse(buffer, (error, data) => {
|
||||
if (error) {
|
||||
console.error('Error parsing PNG:', error);
|
||||
return;
|
||||
}
|
||||
|
||||
// Create a writable stream to save the PNG file
|
||||
const writableStream = nodeFs.createWriteStream(outputPath);
|
||||
|
||||
// Pipe the PNG data to the writable stream
|
||||
png.pack().pipe(writableStream);
|
||||
|
||||
writableStream.on('finish', () => {
|
||||
console.log(`PNG file saved at ${outputPath}`);
|
||||
});
|
||||
});}
|
||||
|
||||
import {
|
||||
getBlockFromAnyGateway,
|
||||
|
||||
|
|
@ -94,15 +133,18 @@ fastify.post('/gateway', getOptions, async (request, reply) => {
|
|||
}
|
||||
})
|
||||
let buffer = ''
|
||||
|
||||
console.log(img.body)
|
||||
const n = await convertToPng(img.body, 'image-0.png')
|
||||
|
||||
/*
|
||||
for await (const chunk of img.body) {
|
||||
buffer += decoder.decode(chunk, {
|
||||
stream: true
|
||||
})
|
||||
}
|
||||
reply.type('plain/text')
|
||||
return buffer
|
||||
*/
|
||||
reply.type('img/png')
|
||||
return nodeFs.readFileSync('./image-0.png')
|
||||
return nodeFs.writeFile('image-0.png', buffer, (err) => {
|
||||
console.log('err', err)
|
||||
})
|
||||
|
|
|
|||
74
api/package-lock.json
generated
74
api/package-lock.json
generated
|
|
@ -29,7 +29,11 @@
|
|||
"js-sha3": "^0.9.2",
|
||||
"kubo-rpc-client": "^3.0.1",
|
||||
"libp2p": "^0.46.11",
|
||||
"multiformats": "^12.1.1"
|
||||
"multiformats": "^12.1.1",
|
||||
"pngjs": "^7.0.0",
|
||||
"stream": "^0.0.2",
|
||||
"stream-to-buffer": "^0.1.0",
|
||||
"web-streams-node": "^0.4.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/cli": "^7.22.15",
|
||||
|
|
@ -3980,6 +3984,11 @@
|
|||
"integrity": "sha512-UdREXMXzLkREF4jA8t89FQjA8WHI6ssP38PMY4/4KhXFQbtImnghh4GkCgrtiZwLKUKVD2iTVXvDVQjfomEQuA==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/emitter-component": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/emitter-component/-/emitter-component-1.1.1.tgz",
|
||||
"integrity": "sha512-G+mpdiAySMuB7kesVRLuyvYRqDmshB7ReKEVuyBPkzQlmiDiLrt7hHHIy4Aff552bgknVN7B2/d3lzhGO5dvpQ=="
|
||||
},
|
||||
"node_modules/encoding": {
|
||||
"version": "0.1.13",
|
||||
"resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
|
||||
|
|
@ -7495,6 +7504,14 @@
|
|||
"resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz",
|
||||
"integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg=="
|
||||
},
|
||||
"node_modules/pngjs": {
|
||||
"version": "7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz",
|
||||
"integrity": "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==",
|
||||
"engines": {
|
||||
"node": ">=14.19.0"
|
||||
}
|
||||
},
|
||||
"node_modules/private-ip": {
|
||||
"version": "3.0.1",
|
||||
"resolved": "https://registry.npmjs.org/private-ip/-/private-ip-3.0.1.tgz",
|
||||
|
|
@ -7655,6 +7672,11 @@
|
|||
"node": ">= 6"
|
||||
}
|
||||
},
|
||||
"node_modules/readable-stream-node-to-web": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/readable-stream-node-to-web/-/readable-stream-node-to-web-1.0.1.tgz",
|
||||
"integrity": "sha512-OGzi2VKLa8H259kAx7BIwuRrXHGcxeHj4RdASSgEGBP9Q2wowdPvBc65upF4Q9O05qWgKqBw1+9PiLTtObl7uQ=="
|
||||
},
|
||||
"node_modules/readdirp": {
|
||||
"version": "3.6.0",
|
||||
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
|
||||
|
|
@ -8093,6 +8115,33 @@
|
|||
"node": ">= 10.x"
|
||||
}
|
||||
},
|
||||
"node_modules/stream": {
|
||||
"version": "0.0.2",
|
||||
"resolved": "https://registry.npmjs.org/stream/-/stream-0.0.2.tgz",
|
||||
"integrity": "sha512-gCq3NDI2P35B2n6t76YJuOp7d6cN/C7Rt0577l91wllh0sY9ZBuw9KaSGqH/b0hzn3CWWJbpbW0W0WvQ1H/Q7g==",
|
||||
"dependencies": {
|
||||
"emitter-component": "^1.1.1"
|
||||
}
|
||||
},
|
||||
"node_modules/stream-to": {
|
||||
"version": "0.2.2",
|
||||
"resolved": "https://registry.npmjs.org/stream-to/-/stream-to-0.2.2.tgz",
|
||||
"integrity": "sha512-Kg1BSDTwgGiVMtTCJNlo7kk/xzL33ZuZveEBRt6rXw+f1WLK/8kmz2NVCT/Qnv0JkV85JOHcLhD82mnXsR3kPw==",
|
||||
"engines": {
|
||||
"node": ">= 0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/stream-to-buffer": {
|
||||
"version": "0.1.0",
|
||||
"resolved": "https://registry.npmjs.org/stream-to-buffer/-/stream-to-buffer-0.1.0.tgz",
|
||||
"integrity": "sha512-Da4WoKaZyu3nf+bIdIifh7IPkFjARBnBK+pYqn0EUJqksjV9afojjaCCHUemH30Jmu7T2qcKvlZm2ykN38uzaw==",
|
||||
"dependencies": {
|
||||
"stream-to": "~0.2.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/stream-to-it": {
|
||||
"version": "0.2.4",
|
||||
"resolved": "https://registry.npmjs.org/stream-to-it/-/stream-to-it-0.2.4.tgz",
|
||||
|
|
@ -8533,6 +8582,29 @@
|
|||
"resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz",
|
||||
"integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow=="
|
||||
},
|
||||
"node_modules/web-streams-node": {
|
||||
"version": "0.4.0",
|
||||
"resolved": "https://registry.npmjs.org/web-streams-node/-/web-streams-node-0.4.0.tgz",
|
||||
"integrity": "sha512-u+PBQs8DFaBrN/bxCLFn21tO/ZP7EM3qA4FGzppoUCcZ5CaMbKOsN8uOp27ylVEsfrxcR2tsF6gWHI5M8bN73w==",
|
||||
"dependencies": {
|
||||
"is-stream": "^1.1.0",
|
||||
"readable-stream-node-to-web": "^1.0.1",
|
||||
"web-streams-ponyfill": "^1.4.1"
|
||||
}
|
||||
},
|
||||
"node_modules/web-streams-node/node_modules/is-stream": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
|
||||
"integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==",
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/web-streams-ponyfill": {
|
||||
"version": "1.4.2",
|
||||
"resolved": "https://registry.npmjs.org/web-streams-ponyfill/-/web-streams-ponyfill-1.4.2.tgz",
|
||||
"integrity": "sha512-LCHW+fE2UBJ2vjhqJujqmoxh1ytEDEr0dPO3CabMdMDJPKmsaxzS90V1Ar6LtNE5VHLqxR4YMEj1i4lzMAccIA=="
|
||||
},
|
||||
"node_modules/webidl-conversions": {
|
||||
"version": "3.0.1",
|
||||
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
|
||||
|
|
|
|||
|
|
@ -38,6 +38,10 @@
|
|||
"js-sha3": "^0.9.2",
|
||||
"kubo-rpc-client": "^3.0.1",
|
||||
"libp2p": "^0.46.11",
|
||||
"multiformats": "^12.1.1"
|
||||
"multiformats": "^12.1.1",
|
||||
"pngjs": "^7.0.0",
|
||||
"stream": "^0.0.2",
|
||||
"stream-to-buffer": "^0.1.0",
|
||||
"web-streams-node": "^0.4.0"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
12
main.tsx
12
main.tsx
|
|
@ -439,10 +439,18 @@ export default class ObsidianLilypad extends Plugin {
|
|||
method: 'POST'
|
||||
})
|
||||
console.log('res', res)
|
||||
|
||||
function _arrayBufferToBase64( buffer ) {
|
||||
var binary = '';
|
||||
var bytes = new Uint8Array( buffer );
|
||||
var len = bytes.byteLength;
|
||||
for (var i = 0; i < len; i++) {
|
||||
binary += String.fromCharCode( bytes[ i ] );
|
||||
}
|
||||
return window.btoa( binary );
|
||||
}
|
||||
const cidNode = createNode(canvas, created,
|
||||
{
|
||||
text: `${res.text}`,
|
||||
text: `<img src="data:image/png;base64,${_arrayBufferToBase64(res.arrayBuffer)}" />`,
|
||||
size: { height: placeholderNoteHeight }
|
||||
},
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in a new issue