.NET’te Görüntüleri Karşılaştırma – Özet Sayfasını Atla

Bir .NET uygulamasında görüntüleri nasıl karşılaştıracağınızı programlı olarak ihtiyaç duyduğunuzda, zaman ve depolama alanını boşa harcayan ekstra bir özet sayfası istemezsiniz. Kalite kontrol hattı, içerik yönetim boru hattı veya otomatik görsel regresyon test paketi oluşturuyor olun, özet sayfasını atlamak her çalıştırmada saniyeler kazandırır ve disk ayak izini hafif tutar.

Bu öğreticide GroupDocs.Comparison for .NET kullanarak iki görüntüyü verimli bir şekilde nasıl karşılaştıracağınızı, özet oluşturmayı nasıl devre dışı bırakacağınızı ve en iyi performans ipuçlarını nasıl uygulayacağınızı öğreneceksiniz. Ayrıca bunun neden önemli olduğunu, ne zaman kullanılacağını ve yaygın tuzaklardan nasıl kaçınılacağını da inceleyeceğiz.

Hızlı Yanıtlar

  • Özet sayfası olmadan görüntüleri karşılaştırmanın en hızlı yolu nedir? Comparer ile CompareOptions kullanın ve GenerateSummaryPage = false olarak ayarlayın.
  • Bu özelliği kutudan çıkar çıkmaz destekleyen kütüphane hangisidir? GroupDocs.Comparison for .NET (v25.4.0+).
  • Lisans gerekir mi? Evet, üretim için ticari bir lisans gereklidir; geliştirme için ücretsiz deneme sürümü çalışır.
  • Bir kerede iki görüntüden fazla karşılaştırabilir miyim? Kesinlikle – Compare()‘den önce Add() metodunu birden çok kez çağırabilirsiniz.
  • Bu yaklaşım büyük ölçekli toplu işler için uygun mu? Evet, toplu işleme ve doğru bellek yönetimiyle birleştirildiğinde uygundur.

GroupDocs.Comparison Nedir?

GroupDocs.Comparison, belgeler ve görüntüler arasındaki görsel farkları tespit eden ve yan yana ya da üst üste bindirilmiş sonuçlar üreten bir .NET kütüphanesidir. 50+ giriş ve çıkış formatını destekler; JPEG, PNG, BMP, TIFF ve GIF gibi formatların yanı sıra, tüm dosyayı belleğe yüklemeden çok sayfalı dosyaları işleyebilir.

Neden Özet Sayfasını Atlamalıyız?

Özet sayfasını devre dışı bırakmak, yalnızca görüntü karşılaştırmaları için %70’e kadar I/O tasarrufu sağlar ve ortalama %30 işleme süresi kısaltır; bu, kütüphanenin benchmark setine göre elde edilen bir sonuçtur. Sadece fark görüntüsüne (otomatik testler veya QC geç/kaldır kararları için) ihtiyacınız olduğunda, ekstra HTML raporu hiçbir değer katmaz ve sadece disk alanı tüketir.

Önkoşullar ve Ortam Kurulumu

Gerekenler

  • GroupDocs.Comparison for .NET sürüm 25.4.0 veya daha yeni
  • Visual Studio 2019 + veya herhangi bir .NET‑uyumlu IDE
  • .NET Framework 4.6.1 + veya .NET Core 2.0 +
  • Temel C# bilgisi ve dosya I/O tecrübesi

Tavsiye Edilen Ekstra

  • source.png ve target.png gibi bir örnek görüntü çifti içeren küçük bir test projesi.
  • İsterseniz servis‑yönelimli mimariyi tercih ediyorsanız bağımlılık enjeksiyonu kurulumu.

Bu Önkoşullar Neden Önemli?

Belirtilen kütüphane sürümü, GenerateSummaryPage bayrağı ve eski sürümlerde bulunmayan performans iyileştirmelerini içerir. Modern bir IDE kullanmak, NuGet paket yönetiminden yararlanmanızı ve derleme zamanında uyarıları erken görmenizi sağlar.

GroupDocs.Comparison Nasıl Kurulur?

GroupDocs.Comparison, NuGet aracılığıyla herhangi bir .NET projesine eklenebilir; bu, ikili dosyaların indirilmesini ve proje dosyasının güncellenmesini otomatik olarak yapar. Çalışma şeklinize uygun yöntemi seçin: Visual Studio kullanıcıları için Package Manager Console ya da komut satırı ortamları için .NET CLI. Her iki komut da bağımlılıkları otomatik çözer ve doğru sürümün referans alınmasını sağlar.

Install-Package GroupDocs.Comparison -Version 25.4.0

(25.4.0 yerine kilitlemek istediğiniz kesin sürümü yazın.)

dotnet add package GroupDocs.Comparison --version 25.4.0

Her iki komut da kütüphaneyi proje dosyanıza ekler ve gerekli ikili dosyaları geri yükler.

İpucu: .csproj dosyanızda sürümü sabitleyin; böylece API davranışını değiştirebilecek istem dışı yükseltmelerden kaçınırsınız.

Lisanslama Hususları

GroupDocs.Comparison, üretim ortamı için bir lisans gerektirir. Ücretsiz deneme sürümü tam işlevsellik sağlar; ardından geçici lisans ile genişletilmiş test yapabilir ve nihayet tam ticari lisans ile üretime geçebilirsiniz. GroupDocs.Comparison.lic dosyasını uygulama kök dizinine koymayı ya da programatik olarak yolunu belirtmeyi unutmayın.

Temel Proje Kurulumu

Yeni bir konsol uygulaması oluşturun (veya mevcut bir servise entegre edin) ve aşağıdaki temel kodu ekleyin. Bu snippet, karşılaştırma mantığına geçmeden önce gerekli minimum ayarları gösterir.

using System;
using System.IO;
using GroupDocs.Comparison;

// Define directory paths for input images and output results
string documentDirectory = "YOUR_DOCUMENT_DIRECTORY";
string outputDirectory = "YOUR_OUTPUT_DIRECTORY";

// Initialize paths to your source and target images
string sourceImagePath = Path.Combine(documentDirectory, "sourceImage.jpg");
string targetImagePath = Path.Combine(documentDirectory, "targetImage.jpg");

// Output image path for comparison result
string resultImagePath = Path.Combine(outputDirectory, "resultImage.jpg");

Önemli: Dosya yolları için her zaman Path.Combine() kullanın. Bu, işletim sistemi‑özel yol ayırıcılarını otomatik olarak yönetir ve Windows ile Linux konteynerleri arasında geçişte ortaya çıkabilecek ince hataları önler.

Adım‑Adım Uygulama Kılavuzu

Özet sayfası olmadan görüntüleri nasıl karşılaştırırım?

Comparer, GroupDocs.Comparison içinde belge ve görüntü karşılaştırma işlemlerini yöneten ana sınıftır. CompareOptions, karşılaştırmanın nasıl yapılacağını kontrol eden yapılandırma ayarlarını tutar; örneğin özet sayfası oluşturulup oluşturulmayacağı gibi. Kaynak görüntüyü yükleyin, CompareOptions içinde özet oluşturmayı devre dışı bırakın, hedef görüntüyü ekleyin ve Compare() metodunu çağırın. Metod, fark görüntüsü akışını içeren bir ComparisonResult döndürür; bu akışı diske yazabilir, ağ üzerinden gönderebilir ya da bir UI bileşenine gömebilirsiniz. Bu yaklaşım, yalnızca gerekli farkı üretir ve ekstra HTML ya da PDF raporlarını ortadan kaldırır.

using (Comparer comparer = new Comparer())
{
    // Load source image
    comparer.Add(sourcePath);

    // Configure options – this is where we turn off the summary page
    CompareOptions options = new CompareOptions
    {
        GenerateSummaryPage = false,
        // You can also tweak sensitivity here if needed
        Sensitivity = 0.5
    };

    // Add the target image for comparison
    comparer.Add(targetPath, options);

    // Execute comparison and retrieve the result image stream
    ComparisonResult result = comparer.Compare();

    // Save the diff image
    using (FileStream outStream = new FileStream(outputPath, FileMode.Create))
    {
        result.Save(outStream);
    }
}

Yukarıdaki kod, dört mantıksal adımda tüm karşılaştırmayı gerçekleştirir ve yalnızca fark görüntüsünü yazar; hiçbir HTML veya PDF özeti oluşturulmaz.

Adım 1: Comparer Nesnesini Başlatma

Comparer sınıfı, tüm karşılaştırma işlemlerinin giriş kapısıdır. IDisposable uygular, bu yüzden bir using bloğu içinde kullanmak, dosya tutamaçları ve yönetilmeyen belleğin bir istisna oluşsa bile hızlıca serbest bırakılmasını garanti eder.

Adım 2: Özet Olmadan CompareOptions Yapılandırması

CompareOptions örneğinde GenerateSummaryPage = false olarak ayarlayın. Bu bayrak, motorun varsayılan HTML raporunu oluşturmasını engeller; bu, yalnızca görüntü senaryolarında ekstra I/O kaynağının başlıca nedenidir.

Adım 3: Karşılaştırma İçin Hedef Görüntü(ler) Ekleme

Add() metodunu birden çok kez çağırarak bir kaynağı birden çok hedefle tek bir toplu işlemde karşılaştırabilirsiniz. Her çağrı, gerektiğinde görüntü‑özel ayarlar için kendi CompareOptions nesnesini alabilir.

Adım 4: Karşılaştırmayı Çalıştırma ve Sonuçları Kaydetme

Comparer.Compare() ağır işi yapar ve bir ComparisonResult döndürür. Sonuç, fark görüntüsünün bulunduğu bir Stream içerir; bu akışı doğrudan diske kaydedebilir, ağ üzerinden gönderebilir ya da bir UI bileşenine gömebilirsiniz.

Üretim‑Hazır Tam Metod

Aşağıda, herhangi bir .NET servisine ekleyebileceğiniz, yol doğrulaması, istisna yönetimi ve isteğe bağlı günlükleme kancaları içeren hazır bir metod yer alıyor.

public static void CompareImagesWithoutSummary(string sourcePath, string targetPath, string outputPath)
{
    try
    {
        using (Comparer comparer = new Comparer(sourcePath))
        {
            // Configure options to skip summary generation
            CompareOptions options = new CompareOptions
            {
                GenerateSummaryPage = false
            };
            
            // Add target image and execute comparison
            comparer.Add(targetPath);
            comparer.Compare(outputPath, options);
            
            Console.WriteLine($"Comparison completed successfully. Result saved to: {outputPath}");
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Error during image comparison: {ex.Message}");
        throw; // Re-throw for proper error handling upstream
    }
}

Yaygın Uygulama Tuzakları (Ve Nasıl Önlenir)

  • Yol Sorunları: File.Exists() ile hem kaynak hem hedef dosyaların varlığını her zaman kontrol edin. Eksik bir dosya FileNotFoundException fırlatır ve erken yakalanabilir.
  • Bellek Baskısı: Büyük görüntüler (10 MB +) önemli miktarda RAM tüketebilir. Bunları partiler halinde işleyin ve piksel‑tam doğruluk gerekmiyorsa ölçeklendirmeyi düşünün.
  • Dosya Kilitleri: Görüntü dosyaları üzerinde başka bir süreç tarafından tutulan ayrıcalıklı bir kilit olmadığından emin olun. Bu, çok iş parçacıklı veya konteyner tabanlı ortamlarda özellikle önemlidir.

Pratik Uygulamalar ve Kullanım Senaryoları

Üretimde Kalite Kontrol

Üretim hattı, her ürünün fotoğrafını alır ve altın referansla karşılaştırır. Özet sayfasını atlamak, sistemin “geçti” ya da “kaldı” kararını milisaniyeler içinde vermesini sağlar ve hattın yüksek hızda çalışmasını engellemez.

İçerik Yönetim Sistemleri

Kullanıcılar varlık yüklediğinde CMS, anında kopya ya da benzer varlıkları tespit ederek depolama şişmesini önleyebilir ve arama alaka düzeyini artırabilir. Fark görüntüsü, hızlı görsel inceleme için bir küçük resim olarak saklanabilir.

Otomatik UI Testi (Görsel Regresyon)

Selenium veya Playwright, bir web sayfasının ekran görüntülerini alır; bu görüntüler daha sonra bu karşılaştırma rutinine beslenir. Fark görüntüsü UI değişikliklerini vurgular ve özet sayfası üretilmediği için CI boru hattı hızlı ve hafif kalır.

Medikal Görüntüleme (Denetimle)

Radyoloji iş akışları, ardışık taramalar arasındaki değişiklikleri işaretlemek zorunda kalabilir. Ayrıntılı bir denetim günlüğü hâlâ üretilebilir, ancak fark görüntüsü özet sayfası olmadan üretildiğinde büyük DICOM‑dönüştürülmüş PNG’ler için işlem süresi azalır.

Performans Düşünceleri ve Optimizasyon

Bellek Yönetimi En İyi Uygulamaları

20–50 görüntülik partiler halinde işleyin; bu sayı sunucu RAM’ine göre ayarlanabilir. Her Comparer örneğini hemen serbest bırakın ve uzun süren işler sırasında bellek dalgalanmaları görürseniz GC.Collect() çağrısını değerlendirin.

foreach (var batch in imageBatches)
{
    using (Comparer comparer = new Comparer())
    {
        // batch processing logic here
    }
}

Disk I/O Optimizasyonu

Girdi, çıktı ve geçici dizinlerinizi aynı hızlı SSD hacmine yerleştirin. Fark görüntüsü kaydedildikten hemen sonra geçici dosyaları silin; böylece gereksiz disk kullanımı önlenir.

Çoklu İş Parçacığı ve Async Düşünceleri

GroupDocs.Comparison, yalnızca okuma‑sadece işlemler için iş parçacığı‑güvenlidir; tek bir Comparer örneğini birden çok iş parçacığı arasında paylaşmaktan kaçının. Bunun yerine bağımsız görevler oluşturun:

var tasks = images.Select(pair => Task.Run(() => ComparePair(pair)));
await Task.WhenAll(tasks);

Yaygın Sorunların Çözümü

Dosya Yolu ve İzin Hataları

  • Belirti: FileNotFoundException veya UnauthorizedAccessException.
  • Çözüm: Çözülmüş yolu görmek için Path.GetFullPath() kullanın, uygulama havuzu kimliğinin (veya Docker konteyner kullanıcısının) okuma/yazma izinlerine sahip olduğundan emin olun ve ortam değişkenleri tarafından yolun kesilmediğini kontrol edin.

Bellek ve Performans Darboğazları

  • Belirti: Yavaş çalıştırmalar veya OutOfMemoryException.
  • Çözüm: Tam piksel karşılaştırması gerekmiyorsa görüntüleri ortak bir çözünürlüğe (ör. 1024 × 768) yeniden boyutlandırın. dotMemory veya yerleşik Performance Profiler gibi araçlarla belleği izleyin.

Lisans Problemleri

  • Belirti: Su damgası (watermark) eklenmiş fark görüntüsü veya LicenseException.
  • Çözüm: GroupDocs.Comparison.lic dosyasının çalıştırılabilir dizinde bulunduğunu doğrulayın veya License license = new License(); license.SetLicense("path/to/license.file"); kodu ile açıkça yükleyin.

Gelişmiş Yapılandırma Seçenekleri

Karşılaştırma Hassasiyetini Özelleştirme

Motorun küçük piksel varyasyonlarını (ör. sıkıştırma artefaktları) nasıl ele alacağını CompareOptions üzerindeki Sensitivity özelliğiyle ayarlayabilirsiniz. Daha düşük değerler karşılaştırmayı daha katı hâle getirir.

CompareOptions options = new CompareOptions
{
    GenerateSummaryPage = false,
    DetectStyleChanges = false,  // Focus on content changes only
    DetalisationLevel = DetalisationLevel.Low  // Faster processing
};

Çıktı Formatı Optimizasyonu

Fark görüntüsünü belirli bir formatta (PNG vs. JPEG) istiyorsanız OutputFormat özelliğini ayarlayın:

options.OutputFormat = ImageSaveOptions.SaveFormat.Png;
CompareOptions options = new CompareOptions
{
    GenerateSummaryPage = false,
    ShowDeletedContent = true,
    ShowInsertedContent = true,
    // Customize highlighting colors if needed
    DeletedItemStyle = new StyleSettings
    {
        HighlightColor = Color.Red,
        FontColor = Color.DarkRed
    }
};

Popüler .NET Frameworkleriyle Entegrasyon

ASP.NET Core Servis Örneği

İki görüntü akışını kabul eden hafif bir HTTP uç noktası oluşturun, karşılaştırmayı çalıştırın ve fark görüntüsünü FileResult olarak döndürün.

public interface IImageComparisonService
{
    Task<string> CompareImagesAsync(string sourceImage, string targetImage);
}

public class ImageComparisonService : IImageComparisonService
{
    private readonly ILogger<ImageComparisonService> _logger;
    private readonly string _outputDirectory;

    public ImageComparisonService(ILogger<ImageComparisonService> logger, IConfiguration config)
    {
        _logger = logger;
        _outputDirectory = config.GetValue<string>("ImageComparison:OutputDirectory");
    }

    public async Task<string> CompareImagesAsync(string sourceImage, string targetImage)
    {
        // Your implementation here
        return await Task.FromResult("comparisonResult.jpg");
    }
}

Bağımlılık Enjeksiyonu Kaydı

Program.cs veya Startup.cs içinde karşılaştırıcıyı scoped bir servis olarak ekleyin:

services.AddScoped<IImageComparisonService, ImageComparisonService>();

Sıkça Sorulan Sorular

S: Özet sayfasını atlamanın temel avantajı nedir?
C: Görüntü‑sadece karşılaştırmalarda işleme süresini %30’a kadar, disk kullanımını ise yaklaşık %70 azaltır; bu, yüksek verimli boru hatları için kritiktir.

S: Özet sayfası olmadan ayrıntılı değişiklik meta verilerini alabilir miyim?
C: Evet. ComparisonResult nesnesi, tespit edilen her fark hakkında programatik bilgi içeren bir Changes koleksiyonu sunar.

S: Hangi görüntü formatları destekleniyor?
C: JPEG, PNG, BMP, TIFF, GIF ve toplamda 50’den fazla format.

S: Çok büyük görüntülerle (ör. >20 MB) nasıl başa çıkmalıyım?
C: Daha küçük partiler halinde işleyin, isteğe bağlı olarak ölçeklendirin ve bellek kullanımını izleyin. Comparer‘ı bir using bloğunda tutmak, kaynakların zamanında serbest bırakılmasını sağlar.

S: Bu yaklaşım çok iş parçacıklı uygulamalar için güvenli mi?
C: Evet, her iş parçacığı kendi Comparer örneğini oluşturduğu sürece güvenlidir. Tek bir örneği paylaşmak yarış koşullarına yol açabilir.

Ek Kaynaklar


Son Güncelleme: 2026-05-31
Test Edilen Sürüm: GroupDocs.Comparison 25.4.0 for .NET
Yazar: GroupDocs

Install-Package GroupDocs.Comparison -Version 25.4.0
dotnet add package GroupDocs.Comparison --version 25.4.0
// Create a Comparer object with the source image path
using (Comparer comparer = new Comparer(sourceImagePath))
{
    // Configuration will follow in subsequent steps
}
// Set up compare options to avoid generating a summary page
CompareOptions options = new CompareOptions();
options.GenerateSummaryPage = false;
// Add the target image to the comparison
comparer.Add(targetImagePath);
// Execute comparison with configured options and save to result path
comparer.Compare(resultImagePath, options);
public static void ProcessImageBatch(List<string> imagePairs, int batchSize = 10)
{
    for (int i = 0; i < imagePairs.Count; i += batchSize)
    {
        var batch = imagePairs.Skip(i).Take(batchSize);
        // Process batch and allow garbage collection between batches
        foreach (var pair in batch)
        {
            // Your comparison logic here
        }
        
        // Explicit garbage collection after each batch (use sparingly)
        GC.Collect();
        GC.WaitForPendingFinalizers();
    }
}
public static async Task<bool> CompareImagesAsync(string source, string target, string output)
{
    return await Task.Run(() =>
    {
        try
        {
            CompareImagesWithoutSummary(source, target, output);
            return true;
        }
        catch
        {
            return false;
        }
    });
}

İlgili Öğreticiler