LinkedIn profile photo 8 MB, 400-7680 px, plus 1584x396 banner
LinkedIn takes a PNG or JPG profile photo up to 8 MB and 400x400 to 7680x4320 px; the background is 1584x396. How to reach 4:1 from a Sume 3:1 image.

LinkedIn's help page gives one size cap and one type rule for personal profile images: a maximum file size of 8MB, PNG or JPG only, and no GIFs. The profile photo must be between 400x400 and 7680x4320 pixels, and the background photo is recommended at 1584x396. LinkedIn also says the photo must reflect your likeness, though an illustration or caricature of yourself is allowed.
The numbers
The page says it was last updated two years ago when read today, so check the live page before a large batch.
| Item | Spec |
|---|---|
| Maximum file size | 8MB |
| Profile photo size | 400x400 to 7680x4320 pixels |
| Background photo | 1584x396 recommended |
| File types | PNG or JPG; GIF not supported |
| Likeness | Photo must reflect your likeness; artistic renderings of yourself are allowed |
Square photo and wide background from Sume
The profile photo is easy. A 1024x1024 request fits Sume's GPT custom-size rules and sits inside LinkedIn's range. LinkedIn's 7680-pixel ceiling is above Sume's 3840-pixel longest edge, so the upper limit never binds.
The background is harder. 1584x396 is 4:1, but GPT custom sizes allow at most 3:1, and 396 is not a multiple of 16 (396 divided by 16 is 24.75). So request 1536x512, which is exactly 3:1, then crop and scale locally.
From 3:1 to 4:1
The crop from 1536x512 to a 4:1 frame keeps the full width and trims the height to 384 pixels. Scaling 1536x384 up to 1584x396 multiplies both edges by exactly 1.03125 (1584 divided by 1536, and 396 divided by 384). ImageOps.fit in Pillow does both steps in one call.
import asyncio, os
from PIL import Image, ImageOps
async def main():
img = Image.open("banner-1536x512.png").convert("RGB")
out = ImageOps.fit(img, (1584, 396), Image.LANCZOS) # crops to 4:1, then scales
out.save("linkedin-background.jpg", "JPEG", quality=92, optimize=True)
size = os.path.getsize("linkedin-background.jpg")
print(out.size, size, "ok" if size <= 8_000_000 else "too big")
asyncio.run(main())Likeness and the size reading
LinkedIn's rule is about likeness, not about the tool. If you generate a portrait, use your own photo as a reference (the docs say openai/gpt-image-2.5 takes up to 16 image references) and judge by eye whether the result looks like you.
The 8MB is not defined on the page. The script checks 8,000,000 bytes, which is the stricter reading of 8MB.
Checklist
- Profile: PNG or JPG, at least 400x400.
- Background: 1584x396, built from a 1536x512 request.
- File under 8,000,000 bytes.
- Keep the original generation and its job record.
Sources
Related posts
More in Use cases
- LinkedIn video ad under 30 FPS and 4:5: what to render
LinkedIn video ads want under 30 FPS and allow 4:5. Sume video models list no 4:5, so render 720x900 at 25 fps in Timeline and check it with video inspect.
- LinkedIn video ad ratios: 16:9, 1:1, 4:5, 9:16 pixel sizes, one table
LinkedIn video ads accept 16:9, 1:1, 4:5 and 9:16 with different pixel rules and under 30 fps. See the table and how to match each ratio on Sume.
- Can you lip-sync an existing video to new audio with Sume?
Sume's docs list no video-to-video lip-sync route. Here are the three documented ways to get a speaking face: from a still, face swap, or a new avatar video.
- Live-commerce host video by API: instruction, input, schema, webhook
How a Sume Format run for a live-commerce style host video is shaped: instruction for decisions, input for data, an output schema, a spend cap and a webhook.
Written by Sume