File size: 1,014 Bytes
0b8f50d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from PIL import Image, ImageChops, ImageEnhance
import io

def run_ela(image: Image.Image, quality: int = 90, threshold: int = 15) -> bool:
    """
    Perform Error Level Analysis to detect image manipulation.

    Parameters:
        image (PIL.Image): Input image (should be RGB).
        quality (int): JPEG compression quality for ELA.
        threshold (int): Maximum pixel difference threshold to classify as edited.

    Returns:
        bool: True if image appears edited, False otherwise.
    """

    # Recompress the image into JPEG format in memory
    buffer = io.BytesIO()
    image.save(buffer, format='JPEG', quality=quality)
    buffer.seek(0)
    recompressed = Image.open(buffer)

    # Compute the pixel-wise difference
    diff = ImageChops.difference(image, recompressed)
    extrema = diff.getextrema()
    max_diff = max([ex[1] for ex in extrema])

    # Enhance difference image for debug (not returned)
    _ = ImageEnhance.Brightness(diff).enhance(10)

    return max_diff > threshold