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;
}