Twenty thousand photos, a full disk, and the copies are not identical in bytes.

The burst you fired at the sea. Your own picture back from WhatsApp at 1,280 pixels. The screenshot of a photo you already had. The RAW sitting next to its JPG. Anything that compares files byte by byte calls those four different photos. They are one.

Elegant Photo Cleaner · duplicate and near-duplicate photos · Windows 10 and 11

Nothing leaves your PC Recycle Bin only — no permanent-delete command Nothing is pre-selected
  • IMG_2841.JPG6000×40008.4 MB
  • IMG_2841 (1).JPG6000×40008.4 MB
  • WhatsApp Image 2026-03-12.jpg1280×85391 KB
  • Screenshot 2026-03-14 093311.png1170×25321.2 MB
  • IMG_2841.CR26000×400031.7 MB

Illustration. Five files, one photograph, five different names, sizes and dates. Not one of them matches another byte for byte.

0
photos, names or hashes that leave your PC
8
kinds of stack, deduced from the evidence — never guessed
15
days of trial, no card
3
languages, switched without restarting

Same photo. Different bytes.

A duplicate finder that compares content hashes is right about one thing and blind to four others. These are the four.

  • The burst. Fourteen frames of the same wave, fired two seconds apart. Same camera, same afternoon, and no two files alike.
  • The trip through WhatsApp. Your own photo comes back recompressed at 1,280 pixels and 91 KB, with a new name and a new date.
  • The screenshot. You took a screenshot of a picture you already had, and now the picture lives twice.
  • RAW next to the JPG. Two files, one press of the shutter, and 31 MB of it is the copy you never open.

SHA-256 a3f9c1…b70e  ·  SHA-256 71c2d8…4f19

The eye says one photo. The hash says two files with nothing in common. Elegant Photo Cleaner finds identical copies with SHA-256 as well, and treats them as the easy half of the problem.

Part of the Elegant family, and not a dependency of it.

Elegant File Explorer organizes files by rules and finds byte-identical duplicates. Neither app requires the other, and nothing on this page needs the sibling installed.

Meet Elegant File Explorer

Math, not AI.

There is no model in here and no inference. There are measurements: five of them, all old, all checkable, and all of them running on your own processor. The same library scanned twice gives the same answer, down to the byte.

Below is what each measurement actually does, drawn rather than described, because the honest version fits in a picture.

Read once, as shallow as possible. stat → 64 KB of header → pixels only for what is left The stack appears while it is still looking canceling never loses what was already analyzed
01
vs

dHash: which side is brighter.

The photo is shrunk to a tiny grey grid and each square is compared with the one beside it. Brighter or darker, one bit. Sixty-four squares, sixty-four bits, and what you get is a fingerprint of the shape of the picture rather than of its bytes. Resize it, save it again at 91 KB, and the fingerprint barely moves. In the drawing above, two of the sixty-four bits disagree.

It is not a comparison of thumbnails, and color is not what it looks at.

02

pHash: the shape underneath the detail.

A second signature keeps only the low frequencies of the image, the broad masses instead of the grain. It is what survives a brutal recompression, and it is also the one that says no when two pictures merely happen to look alike.

03
Conservative dHash ≤ 6 AND pHash ≤ 8 radius 4

Hamming distance, and the word AND.

Two signatures are compared by counting the bits that differ. A pair only becomes a similarity edge when both agree, dHash and pHash together, never one or the other. That single word is what keeps a scanned document readable: two different pages of the same document sit two bits apart on dHash alone, and would be glued together by a looser rule.

There is no free number to type, and nothing more permissive than the widest step. The engine refuses it by name.

04

Laplacian variance: which frame is the sharp one.

Inside a stack that already exists, the app measures how abruptly light changes across each frame. A shaky frame produces a low number, a crisp one a high number. That is how the fourteen frames of the same wave can be put in order of sharpness without anyone squinting at them.

It does not go hunting for blurry photos on its own. A single blurry photo has no partner, so it never enters a plan.

05
EXIF camera · NIKON Z 6 capture · 14:02:07.12 next frame · +1.8 s

EXIF: same camera, two seconds apart.

Bursts are not found by looking at pixels. They are found in the camera's own record: the same camera, capture times at most two seconds apart, and the whole stack inside thirty seconds. It is a time edge, not a picture edge, and the window is the same on all three similarity steps.

These numbers belong to the engine. The screen never shows you a score: it shows a sentence. And the result is deterministic: the same library gives the same answer, byte for byte, on any machine.

100%
rotated 90°, 180° or mirrored
≥ 99%
recompressed or resized
≥ 95%
with a border added
80 → 100%
very flat photos: sky, a wall, a document

Floors, not averages: the worst value observed, measured on the Conservative step, which is the default and the strictest of the three. These are recall figures from the engine's own seeded corpus, rebuilt across six independent seeds. They are not a precision number, they are not your library, and they do not add up to a single percentage. Very flat photos reach 100% from the Normal step upwards.

Eight kinds of stack. The label never lies.

The kind is deduced from the evidence edges inside the stack, never guessed from a resemblance. Every stack holds at least two distinct files, so a shortcut or a hard link pointing at the same file never becomes one. Seven of them name why two photos are together; the eighth, Blurry frames, is a lens — it sorts by sharpness inside a stack that already exists for another reason.

Elegant Photo Cleaner stacks screen: a grid of stacks, each card labelled Identical, Look-alikes, Recompressed, Burst, Screenshots or RAW + JPG, with how many photos it holds and how much space it frees Elegant Photo Cleaner stacks screen: a grid of stacks, each card labelled Identical, Look-alikes, Recompressed, Burst, Screenshots or RAW + JPG, with how many photos it holds and how much space it frees
The stacks screen. Every card carries its kind, how many photos it holds and how much it frees. Nothing on it is pre-selected, and the row at the top is a class the engine distrusts and refuses to propose anything about.
01

Identical

The same bytes, with SHA-256 equal across every member of the stack. Different names, folders and dates, one file. This is the only kind that gets a suggestion badge.

SHA-256
02

Look-alikes

The same picture after a resize, a recompression, a rotation or a mirror. dHash and pHash have to agree, and the edge carries which of the eight symmetries was applied.

dHash AND pHash
03

Recompressed

The same image at another scale or weight: compatible proportions, different dimensions or file size. The 8 MB original and the 91 KB copy from the messaging app.

proportion + size
04

Burst

Frames from the same camera, at most two seconds apart, with the whole stack inside a thirty-second span. Found in the EXIF record, not in the pixels.

EXIF, up to 2 s
05

Screenshots

A screenshot that contains a photo you already have. It only exists when the uniform frame around the picture can be measured and cropped away.

content box
06

Blurry

A lens, not a hunt. Inside a stack that already exists for another reason, it shows which frame is the shaky one, measured by sharpness. It never goes looking for blurry photos on its own.

sharpness, inside a stack
07

RAW + JPG

The RAW and the developed file from the same shutter press, verified pair by pair. Strong proof is the companion set, same folder and same base name; weak proof is the same camera with capture times touching.

verified pair by pair
08

Videos

Two of three keyframes, sampled at 10%, 50% and 90%, within the threshold, plus a duration within one second. The relation is checked pair by pair and never chained.

off by default

RAW and video analysis both start switched off, and the cost of video is said out loud before you turn it on. A stack the engine distrusts, such as thousands of near-identical screenshots, is shown and explained and proposes absolutely nothing.

Elegant Photo Cleaner doorway: the folders of your library with SSD, HDD and Cloud badges, the card What goes into the analysis with RAW and video switched off, and the count of photos analysed Elegant Photo Cleaner doorway: the folders of your library with SSD, HDD and Cloud badges, the card What goes into the analysis with RAW and video switched off, and the count of photos analysed
The doorway. The folders you chose, with what sits on SSD, on HDD or in the cloud. RAW and video arrive switched off, with the cost of video written beside the switch — and what could not be opened is counted out loud instead of passing as "nothing found".

It tells you why, in words.

When two photos land in the same stack, the app does not hand you a percentage to interpret. It hands you the reason.

“The same photo, rotated.” That is the whole explanation the app gives, and it is enough. There is no score of 0 to 100 anywhere in the product, and its absence is a decision rather than a missing feature.
the same photo, mirrored the same photo, rotated the same photo, rotated the other way the same photo, rotated and mirrored

The comparer is where you decide.

  • Synchronized zoom. The same region in every photo of the stack, which is what lets a 6000×4000 original and a 1280×853 copy show you the same eyelash.
  • A 1:1 loupe under the cursor, plus the honest card of each file: dimensions, bytes, capture time, camera, measured sharpness, full path.
  • Clicking pins the file that stays. It never marks a victim. Nothing in the engine outranks a pin you placed.
  • No direct edge between two photos? Then it shows you the whole path between them, hop by hop, instead of asserting a relationship it cannot draw.
IMG_2841.JPG 6000 × 4000 · 8.4 MB · 12 Mar 2026 14:02 NIKON Z 6 · sharpness 812 D:\Photos\2026\March\IMG_2841.JPG

Illustration of the file card. The eight symmetries of the square are covered: 90°, 180°, 270° and the mirrors. A photo taken 7° crooked is a different problem, and it is in the known limits.

Elegant Photo Cleaner comparer: three copies of the same photo side by side with synchronised zoom, each one with its file card — dimensions, weight, capture time, camera, sharpness and full path — and the reason it is in the stack Elegant Photo Cleaner comparer: three copies of the same photo side by side with synchronised zoom, each one with its file card — dimensions, weight, capture time, camera, sharpness and full path — and the reason it is in the stack
The comparer. The zoom is the same across every photo, which is what lets a 6,000×4,000 original and a 1,280×853 copy show you the same region. Each card says why it is there, and clicking pins the one that stays.

Nothing leaves without you.

The similarity control has exactly three steps. It changes what you see. It never changes what is proposed.

Conservative6 · 8 · radius 4

The default, and the strictest. Fewer pairs on screen, and the measurement floors above were taken here.

Normal8 · 10 · radius 6

The middle step. Flat photos, such as sky, a wall or a scanned page, are reached in full from here upwards.

Wide12 · 14 · radius 8

The widest the engine goes. Anything more permissive is a refusal written into the code, by name.

Elegant Photo Cleaner plan screen: review by evidence class, each class with its stacks, photos and gigabytes, a warning that cloud-synced photos also leave your phone, and the button that sends everything to the Recycle Bin Elegant Photo Cleaner plan screen: review by evidence class, each class with its stacks, photos and gigabytes, a warning that cloud-synced photos also leave your phone, and the button that sends everything to the Recycle Bin
The plan, class by class. A handful of cards instead of thousands of confirmations — each one with its stacks, its photos and its gigabytes, the sentence saying who survives, and a single exit: the Windows Recycle Bin.

The lenses change what you see. None of them proposes a deletion.

The only destructive verb in this app is the Recycle Bin.

Permanent deletion does not exist here. Not as a hidden option, not as a box you can check, not as a setting we chose to default off.

It is structural. There is no path in the app that deletes a photo of yours for good: the only deletion calls that exist in the sources touch the app's own log and its own configuration files. The app cannot grow new deletion abilities or a connection to the internet: those limits are part of how it is built, not settings and sockets.

  1. 1
    A plan, reviewed and approved.

    Nothing moves before the plan is on screen, reviewed class by class and approved. There is no function anywhere in the app that recycles a path on its own.

  2. 2
    The intention is written first.

    A write-ahead journal records what is about to happen before a single file moves. No journal, nothing moves. Moving without a net is deleting.

  3. 3
    The bytes are checked again.

    Immediately before recycling, it re-reads the SHA-256 and the timestamp of the victim and of the survivor. Any divergence drops the whole stack with a named reason, and “I could not look” is never recorded as “I looked and found nothing”.

  4. 4
    To the Recycle Bin, with the undo flag.

    Companions travel with the file they belong to: the .MOV of a Live Photo, the .XMP of a RAW.

  5. 5
    The survivor is opened.

    After the cleanup, the app checks that the photo that stayed still exists and actually decodes. If it does not open, the whole batch comes back from the Recycle Bin and the screen says so.

  6. 6
    Undo, including tomorrow.

    If you closed the window, the offer is waiting the next time you open the app, and the companion files come back together.

Where there is no Recycle Bin, the app does not pretend there is one. On a memory card, a USB stick or a network drive, those items leave the plan before Windows is ever called, counted and weighed on screen. If Windows removes something directly anyway, the journal records “permanently deleted” rather than “recycled”, and no undo is offered, because it could not be honoured. Undo also depends on the files still being in the Recycle Bin: empty it and no verb can bring them back.

Complete on its own. With its sibling installed, it counts what it can add.

Integration is a bonus and never a toll. What is not genuinely available on your machine does not appear at all: no dead buttons, no notice explaining what you are missing.

Show it in Explorer.

The photo you kept opens already selected in its folder, inside Elegant File Explorer.

Organize what arrives next.

The app writes a rule for the photos that land from now on and hands it over. The rule arrives switched off, for you to read first.

Turning decisions into tags does not exist.

The verb is missing on the other side, so the button is missing on this side. When it exists, it will be counted like the others.

Meet Elegant File Explorer

One price, once.

US$ 9.99US$ 12.99launch price
  • 15-day trial on your PC, no card and no account.
  • One-time purchase. No subscription and no renewal.
  • Nothing leaves your PC. No photo, no file name, no hash.
  • Three languages from day one, switched without restarting.
  • Light, dark or automatic, crossed with classic or modern. Four combinations, all live.
  • Windows 10 version 1809 or newer, and Windows 11. 64-bit.

Elegant Photo Cleaner is on the Microsoft Store. The launch price is for a limited time.

Known limits.

Saying it costs less than hiding it, and all of these are consequences of decisions we would make again.

  • Very flat photos are the hard case. Sky, a smooth wall, a beach, a scanned document. On the Conservative step the engine finds about 80% of those pairs, and 100% from Normal upwards. Loosening the rule instead would glue two different pages of the same document together, so the answer is the step, not a looser rule.
  • Video stacks do not survive a restart. Photo stacks are painted back when you open the app. Video stacks are rebuilt each session, so they need a fresh scan. The alternative was making every photo in your library carry three fields only videos use.
  • Out of reach of image comparison: a real crop, a cut panorama, a collage, a photo taken of a screen, an arbitrary rotation such as 7°, and a decorative frame that is not uniform. Only the eight symmetries of the square are covered.
  • HEIC, RAW, WebP and video depend on Windows extensions. The app probes the codecs before the heavy analysis and names the extension that solves it. What could not be read is counted on screen and can be neither victim nor survivor, because “I could not look” is the most expensive wrong answer a cleaning tool can give.
  • Photos that live only in the cloud are indexed, not opened. Opening one means downloading the whole file, so the analysis is enabled folder by folder with the bytes said out loud first. Deleting inside a synced folder also deletes on your phone, and that takes an extra acknowledgment.
  • Photos with a sidecar are left alone by default. A .xmp, .aae or .json next to the file, or a RAW whose partner has one, is blocked as a named class. You can release that class with an explicit gesture, and then there is an edge case where the sidecar of a byte-identical victim is left orphaned.
  • It does not scan your computer on its own. You declare the folders, and a whole-volume root is refused. Network folders are not probed, because a network probe can freeze for tens of seconds, and the headless mode refuses a network root outright.
  • A burst with a panorama in the middle can come out as two or three stacks rather than one. That is the price of the tightening rule that stops unrelated photos from being chained into one enormous stack, and we would pay it again.
  • The package is 64-bit. On an ARM machine it runs under emulation. There is no macOS or Linux version.

Frequently asked questions.

Does it find photos that are not identical in bytes?

Yes, that is the whole point. Two signatures are taken from every photo, dHash and pHash, and a pair is only called similar when both agree. That is how the same picture is found again after it comes back from WhatsApp at 1,280 pixels, after it is rotated, mirrored or resized. Byte-identical copies are found too, by SHA-256, and they are the only ones that get a suggestion badge.

Does it use artificial intelligence?

No. There is no model and no inference. It measures: dHash, pHash, Hamming distance, Laplacian variance for sharpness, and the camera's own EXIF record for bursts. The same library always gives the same result.

Can it delete a photo on its own?

No. Nothing is born selected, the plan is reviewed class by class and approved by you, and the only destructive verb in the app is sending a file to the Windows Recycle Bin. Permanent deletion does not exist here, not even as a hidden option.

Do my photos leave my computer?

No photo, no file name and no hash leaves your machine. The app has no way to connect to the internet. The only connection that exists is the license and 15-day trial check against the Microsoft Store, made by Windows' own API, and it is fail-open: if the Store cannot be reached, the access you already had stays.

Can I undo a cleanup?

Yes, from inside the app, including at the next launch if you closed the window. Companion files travel together and come back together: the .MOV of a Live Photo, the .XMP of a RAW. Undo depends on the files still being in the Windows Recycle Bin. If you emptied it, no verb can bring them back, and the app says so instead of pretending.

What about iPhone photos, RAW files and videos?

HEIC, RAW, WebP and video need the matching Windows codec extension. The app probes the codecs before the heavy analysis and names the extension that solves it, and whatever could not be read is counted on screen and can be neither victim nor survivor. RAW and video analysis start switched off, and video stacks are rebuilt each session.

Do I need Elegant File Explorer?

No. Elegant Photo Cleaner is complete on its own. If the sibling is installed, the app counts what actually became available on your machine and shows only that. Whatever is not available simply does not appear: no dead buttons and no notice.

Is there a subscription?

No. One-time purchase, no subscription and no renewal, with a 15-day trial on your PC, no card and no account.

The copies are not identical. That is exactly why they are still there.

Elegant Photo Cleaner finds the same photo across different names, sizes and dates, shows you the evidence in words, and sends nothing anywhere without you.

On the Microsoft Store. Windows 10 version 1809 or newer, and Windows 11.