Spaces:
Running
Running
File size: 3,861 Bytes
a51c565 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 | import { readImageDimensions } from '../skills/gpt-image-playground-agent/scripts/lib/image-dimensions.mjs';
import assert from 'node:assert/strict';
import { test } from 'node:test';
test('readImageDimensions reads PNG dimensions', () => {
assert.deepEqual(readImageDimensions(pngBuffer(3840, 2160)), { width: 3840, height: 2160 });
});
test('readImageDimensions reads JPEG dimensions', () => {
assert.deepEqual(readImageDimensions(jpegBuffer(1280, 720)), { width: 1280, height: 720 });
});
test('readImageDimensions reads progressive JPEG dimensions', () => {
assert.deepEqual(readImageDimensions(jpegBuffer(1600, 900, 0xc2)), { width: 1600, height: 900 });
});
test('readImageDimensions reads WebP VP8X dimensions', () => {
assert.deepEqual(readImageDimensions(webpVp8xBuffer(1024, 1024)), { width: 1024, height: 1024 });
});
test('readImageDimensions reads WebP VP8L dimensions', () => {
assert.deepEqual(readImageDimensions(webpVp8lBuffer(512, 768)), { width: 512, height: 768 });
});
test('readImageDimensions reads WebP VP8 dimensions', () => {
assert.deepEqual(readImageDimensions(webpVp8Buffer(640, 360)), { width: 640, height: 360 });
});
test('readImageDimensions rejects empty buffers', () => {
assert.throws(() => readImageDimensions(Buffer.alloc(0)), /图片数据为空/);
});
test('readImageDimensions rejects unknown formats', () => {
assert.throws(() => readImageDimensions(Buffer.from('not-an-image')), /无法识别图片格式/);
});
test('readImageDimensions rejects truncated PNG buffers', () => {
assert.throws(() => readImageDimensions(pngBuffer(1, 1).subarray(0, 16)), /PNG 图片数据截断/);
});
test('readImageDimensions rejects truncated JPEG buffers', () => {
assert.throws(() => readImageDimensions(Buffer.from([0xff, 0xd8, 0xff, 0xc0, 0x00])), /JPEG 图片数据截断/);
});
test('readImageDimensions rejects JPEG SOF segments without enough metadata for dimensions', () => {
assert.throws(() => readImageDimensions(jpegBuffer(1280, 720, 0xc0, 0x07)), /JPEG 图片数据截断/);
});
test('readImageDimensions rejects truncated WebP buffers', () => {
assert.throws(() => readImageDimensions(webpHeader('VP8X', 20)), /WebP 图片数据截断/);
});
function pngBuffer(width, height) {
const buffer = Buffer.alloc(24);
buffer[0] = 0x89;
buffer.write('PNG', 1, 'ascii');
buffer[4] = 0x0d;
buffer[5] = 0x0a;
buffer[6] = 0x1a;
buffer[7] = 0x0a;
buffer.writeUInt32BE(13, 8);
buffer.write('IHDR', 12, 'ascii');
buffer.writeUInt32BE(width, 16);
buffer.writeUInt32BE(height, 20);
return buffer;
}
function jpegBuffer(width, height, marker = 0xc0, length = 0x0b) {
return Buffer.from([
0xff,
0xd8,
0xff,
0xe0,
0x00,
0x04,
0x00,
0x00,
0xff,
marker,
0x00,
length,
0x08,
(height >> 8) & 0xff,
height & 0xff,
(width >> 8) & 0xff,
width & 0xff,
0x01,
0x01,
0x11,
0x00
]);
}
function webpHeader(chunk, length) {
const buffer = Buffer.alloc(length);
buffer.write('RIFF', 0, 'ascii');
buffer.write('WEBP', 8, 'ascii');
buffer.write(chunk, 12, 'ascii');
return buffer;
}
function webpVp8xBuffer(width, height) {
const buffer = webpHeader('VP8X', 30);
buffer.writeUIntLE(width - 1, 24, 3);
buffer.writeUIntLE(height - 1, 27, 3);
return buffer;
}
function webpVp8lBuffer(width, height) {
const buffer = webpHeader('VP8L', 25);
const bits = ((height - 1) << 14) | (width - 1);
buffer.writeUInt32LE(bits, 21);
return buffer;
}
function webpVp8Buffer(width, height) {
const buffer = webpHeader('VP8 ', 30);
buffer.writeUInt16LE(width, 26);
buffer.writeUInt16LE(height, 28);
return buffer;
}
|