# Alt Alt Text مع معظمها Lluccid.llmmlltText

هل تريد أن تحصل على نص جميل وصفي لصور في مواقعك أو نص مستخرج من Jsuut من تلك المواقع؟ `mostlylucid.llmalttext` يستخدم نموذج لغة ميكروسوفت للرؤية الفلورنسا - 2 لتوليد نص عالي الجودة للدالة تلقائياً - يعمل محلياً تماماً على آلتك، لا توجد مفاتيح API مطلوبة.

> ملاحظة: أحتاج إلى تحديث هذه الوثيقة الآن [دعم ](https://www.nuget.org/packages/Mostlylucid.LlmAltText)إذا نظرت [هنا هنا](https://github.com/scottgal/mostlylucid.nugetpackages/tree/main/Mostlylucid.AltText.Demo) يمكنك تحميلها واستخدامها، سأحدّث هذا بالتفاصيل في الأيام القادمة.

<datetime class="hidden">2025-11-24T10:00</datetime>

<!-- category -- ASP.NET, Accessibility, AI, NuGet, Florence-2, Image Processing -->
[![](https://img.shields.io/nuget/v/mostlylucid.llmaltText.svg)](https://www.nuget.org/packages/mostlylucid.llmalttext) [![الرخصة: الرخصة](https://img.shields.io/badge/license-Unlicense-blue.svg)](http://unlicense.org/)

# أولاً

لـ نصّ مهمّ الـ شاشة قراء يعمل الإيطالية SEO ترتيب الإيطالية بوصة و هو هو الإيطالية هو صحيح إلى لـ وصول لكن كتابة جيد بديل نص لـ مئات من صورة ذلك حيث الكل منّا قصّر.

حلت هذه الحزمة تلك المشكلة باستخدام نموذج ميكروسوفت لغوي للرؤية فلورنسا-2 - يعمل محلياً على آلتك، لا حاجة إلى مفاتيح API.

**المصدر: المصدر: المصدر.** [مواد تغليف النبتات](https://github.com/scottgal/mostlylucid.nugetpackages/tree/main/Mostlylucid.LlmAltText)

[TOC]

# المشكلة

ألف - كل `<img>` يجب أن يكون لعلامة الوسم نص بديل. لكن في الممارسة العملية:

- **كتابة كتابات كتابية مضجرة** - مئات الصور: ساعات العمل
- **تكاليف المشاريع** - الرؤية OpenAI، كلود، وما إلى ذلك، الجمع بسرعة
- **** - قد لا ترغب في إرسال صور إلى معاينة
- **الجودة غير المتوافقة** - أناس مختلفون يكتبون نصوصاً مختلفة بشكل مختلف

ماذا لو أمكنك توليد نص بديل عالي الجودة تلقائياً، تعمل كلياً على جهازك الخاص؟

# كيف تعمل

يستخدم الحزمة نموذج ميكروسوفت فلورنس-2 عبر أونكس وقت التشغيل. ها هو خط المعالجة:

```mermaid
flowchart TB
    subgraph Input[Image Sources]
        A[File Path]
        B[URL]
        C[Stream]
        D[Byte Array]
    end

    subgraph Processing[Florence-2 Pipeline]
        E[Image Preprocessing]
        F[Vision Encoder]
        G[Language Decoder]
    end

    subgraph Output[Results]
        H[Alt Text]
        I[OCR Text]
        J[Content Type]
    end

    A --> E
    B --> E
    C --> E
    D --> E
    E --> F
    F --> G
    G --> H
    G --> I
    G --> J

    style A stroke:#10b981,stroke-width:2px
    style B stroke:#10b981,stroke-width:2px
    style C stroke:#10b981,stroke-width:2px
    style D stroke:#10b981,stroke-width:2px
    style F stroke:#6366f1,stroke-width:2px
    style G stroke:#6366f1,stroke-width:2px
    style H stroke:#ec4899,stroke-width:2px
    style I stroke:#ec4899,stroke-width:2px
    style J stroke:#ec4899,stroke-width:2px
```

**السمات الرئيسية:**

- **** - لا مكالمات API، لا تكاليف، لا مخاوف بخصوصية
- **طراز 8000.000.000.000.000.000.000.000.000.000.000.000.000.000.** - تنزيلات مرة واحدة، إلى الأبد
- **** - نبذات مختصرة، وأوصاف مفصلة، وأجهزة مراقبة
- **التصنيف** -يعرف ما إذا كانت صورة، رسم بياني، شاشات، الخ.

# بدءQQQQQCQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ

## عدد أفراد

```bash
dotnet add package Mostlylucid.LlmAltText
```

## لا شيء

```csharp
// Program.cs
builder.Services.AddAltTextGeneration();
```

هذه هي. أول عملية تقوم بتنزيل نموذج فلورنسا - 2 (-800MB )، ثم تكون مستعداً للذهاب.

## 

```csharp
public class ImageController : ControllerBase
{
    private readonly IImageAnalysisService _imageAnalysis;

    public ImageController(IImageAnalysisService imageAnalysis)
    {
        _imageAnalysis = imageAnalysis;
    }

    [HttpPost("analyze")]
    public async Task<IActionResult> Analyze(IFormFile image)
    {
        using var stream = image.OpenReadStream();
        var altText = await _imageAnalysis.GenerateAltTextAsync(stream);

        return Ok(new { altText });
    }
}
```

# مصادر متعددة

تقبل الخدمة الصور من أي مكان - الملفات، العناوين، الجداول، أو الصفائف الفرعية.

## 

```csharp
var altText = await _imageAnalysis.GenerateAltTextFromFileAsync("/images/photo.jpg");
```

## من المصدر

```csharp
var altText = await _imageAnalysis.GenerateAltTextFromUrlAsync(
    "https://example.com/image.png");
```

## من & سطر

```csharp
using var stream = file.OpenReadStream();
var altText = await _imageAnalysis.GenerateAltTextAsync(stream);
```

## من طراز BAT Arari

```csharp
var bytes = await httpClient.GetByteArrayAsync(imageUrl);
var altText = await _imageAnalysis.GenerateAltTextAsync(bytes);
```

# نوع المهام:::::::

Plower-2 يدعم ثلاث طرق للشرح. اختر بناءً على احتياجاتك:

```csharp
// Brief - "A dog sitting on grass"
var brief = await _imageAnalysis.GenerateAltTextAsync(stream, "CAPTION");

// Detailed - "A golden retriever sitting on green grass in a park"
stream.Position = 0;
var detailed = await _imageAnalysis.GenerateAltTextAsync(stream, "DETAILED_CAPTION");

// Most detailed (default) - Full accessibility description
stream.Position = 0;
var full = await _imageAnalysis.GenerateAltTextAsync(stream, "MORE_DETAILED_CAPTION");
// "A happy golden retriever with light fur sitting on lush green grass
//  in a sunny park, with trees visible in the background."
```

**2 - متى يستخدم كل من:**

نوع المهمة / أفضل لـ /
|-----------|----------|
| `CAPTION` الأظافر، الصور المزخرفة، أدوات سريعة
| `DETAILED_CAPTION` □ وسائط الإعلام الاجتماعية، التسهيلات الأساسية
| `MORE_DETAILED_CAPTION` □ إمكانية الوصول الكامل، أجهزة قراءة الشاشة (موصى بها) □

# اخراج النص

ويمكن ايضا ان تستخلص فلورنسا - ٢ نصوصا من الصور - مفيدة للشاشات والوثائق والرسوم البيانية .

```csharp
// Extract text only
var extractedText = await _imageAnalysis.ExtractTextAsync(stream);

// Get both alt text and extracted text
var (altText, ocrText) = await _imageAnalysis.AnalyzeImageAsync(stream);

Console.WriteLine($"Alt: {altText}");
Console.WriteLine($"OCR: {ocrText}");
```

# التصنيف

ليس كل الصور متشابهة. أي صورة تحتاج إلى نص status that; a مستند يحتاج المحتوى النصي. ميزة التصنيف تساعدك على التعامل مع كل منها بشكل مناسب:

```csharp
var result = await _imageAnalysis.AnalyzeWithClassificationAsync(stream);

Console.WriteLine($"Type: {result.ContentType}");        // e.g., "Photograph"
Console.WriteLine($"Confidence: {result.ContentTypeConfidence:P0}"); // e.g., "87%"
Console.WriteLine($"Has Text: {result.HasSignificantText}");
```

## جاري المناولة مُمِس مختلف المحتوى المُنْس

```csharp
var result = await _imageAnalysis.AnalyzeWithClassificationAsync(stream);

switch (result.ContentType)
{
    case ImageContentType.Document:
        // Documents - prioritize extracted text
        return result.ExtractedText;

    case ImageContentType.Screenshot:
        // Screenshots - combine description with UI text
        return result.HasSignificantText
            ? $"{result.AltText}. Text visible: {result.ExtractedText}"
            : result.AltText;

    case ImageContentType.Chart:
        // Charts - describe the visualization plus data
        return $"{result.AltText}. Data: {result.ExtractedText}";

    case ImageContentType.Photograph:
    default:
        // Photos - just the description
        return result.AltText;
}
```

## 

□ النوع / الوصف /
|------|-------------|---------|
| `Photograph` • صور في العالم الحقيقي: الناس، المناظر الطبيعية، المنتجات
| `Document` □ المحتوى الكمي من النصوص □ الاستمارات والاستمارات والمواد □
| `Screenshot` • البرمجيات التي تُلتقط فيها المعلومات الأساسية، والمواقع الشبكية، والتطبيقات
| `Chart` الرسوم البيانية والرسوم البيانية والرسوم البيانية والجداول
| `Illustration` مواد فنية، كرتونات، أيقونات
| `Diagram` رسومات تقنية، رسومات بيانية، رسومات بيانية، رسومات تخطيطية
| `Unknown` (أ) قضايا حُدج غير مُصنَّفة(أ)

# الـ سوث مُجلّف مُنتر مُنتم مُنتر

هنا حيث أنها تحصل على مُثيرة للاهتمام. الـ مُوَجِّل المُحَلّ آلياً يولّد نص مُقتل لـ أي `<img>` علامة العلامـة مفقودـة واحد - في الوقت المناسب.

## إنشاء

```csharp
// Program.cs
builder.Services.AddAltTextGeneration(options =>
{
    options.EnableTagHelper = true;
    options.EnableDatabase = true;  // Cache results
    options.DbProvider = AltTextDbProvider.Sqlite;
    options.SqliteDbPath = "./alttext.db";
});

var app = builder.Build();
await app.Services.MigrateAltTextDatabaseAsync();
```

الـ سِجِل `_ViewImports.cshtml`:

```cshtml
@addTagHelper *, Mostlylucid.LlmAltText
```

## كيف تعمل

```mermaid
flowchart LR
    subgraph Razor[Razor View Rendering]
        A[img tag found]
        B{Has alt attribute?}
        C[Skip - use existing]
        D{In cache?}
        E[Return cached]
        F[Fetch image]
        G[Generate alt text]
        H[Cache result]
        I[Render with alt]
    end

    A --> B
    B -->|Yes| C
    B -->|No| D
    D -->|Yes| E
    D -->|No| F
    F --> G
    G --> H
    H --> I
    E --> I

    style A stroke:#10b981,stroke-width:2px
    style B stroke:#6366f1,stroke-width:2px
    style G stroke:#ec4899,stroke-width:2px
    style I stroke:#8b5cf6,stroke-width:2px
```

## ما تم تجهيزه

```html
<!-- NO ALT - Will be processed -->
<img src="https://example.com/photo.jpg" />

<!-- HAS ALT - Skipped (respects your text) -->
<img src="https://example.com/photo.jpg" alt="My custom description" />

<!-- EMPTY ALT - Skipped (decorative image per a11y standards) -->
<img src="https://example.com/decorative.jpg" alt="" />

<!-- EXPLICIT SKIP - Skipped -->
<img src="https://example.com/photo.jpg" data-skip-alt="true" />

<!-- DATA URI - Skipped (can't fetch) -->
<img src="data:image/png;base64,..." />

<!-- RELATIVE PATH - Skipped (needs absolute URL) -->
<img src="/images/photo.jpg" />
```

## (تابع)

من أجل الأمن، يمكنك أن تحدّد المجالات التي سيجلبها التابل من:

```csharp
options.AllowedImageDomains = new List<string>
{
    "mycdn.example.com",
    "images.mysite.org",
    "cdn.githubusercontent.com"
};
```

# 

بدون كشّف، كل صفحة إعادة تشغيل من شأنها أن تُعيد كتابة نص بديل. هذا بطيء و مُهَرِّب. قاعدة البيانات مخزنات المخابئ نتائجها مُثبّتة بواسطة صورة URL.

## QLليت (التنمية)

```csharp
builder.Services.AddAltTextGeneration(options =>
{
    options.EnableDatabase = true;
    options.DbProvider = AltTextDbProvider.Sqlite;
    options.SqliteDbPath = "./alttext.db";
    options.CacheDurationMinutes = 60;
});
```

## PostgreSQL (المنح)

```csharp
builder.Services.AddAltTextGeneration(options =>
{
    options.EnableDatabase = true;
    options.DbProvider = AltTextDbProvider.PostgreSql;
    options.ConnectionString = Configuration.GetConnectionString("AltTextDb");
});
```

# 

```csharp
builder.Services.AddAltTextGeneration(options =>
{
    // Model location (~800MB downloaded here)
    options.ModelPath = "./models";

    // Default task type for alt text generation
    options.DefaultTaskType = "MORE_DETAILED_CAPTION";

    // Maximum word count for alt text
    options.MaxWords = 90;

    // Enable detailed logging
    options.EnableDiagnosticLogging = true;

    // TagHelper settings
    options.EnableTagHelper = true;
    options.EnableDatabase = true;
    options.AutoMigrateDatabase = true;

    // Database provider
    options.DbProvider = AltTextDbProvider.Sqlite;
    options.SqliteDbPath = "alttext.db";
    // or
    options.DbProvider = AltTextDbProvider.PostgreSql;
    options.ConnectionString = "Host=localhost;Database=alttext;...";

    // Security
    options.AllowedImageDomains = new List<string> { "cdn.example.com" };
    options.SkipSrcPrefixes = new List<string> { "data:", "blob:" };

    // Caching
    options.CacheDurationMinutes = 60;
});
```

# مثال عالمي حقيقي: تجهيز المراسِل

هذه هي الطريقة التي استخدمها لمعالجة الصور عند استيراد المدوّنات:

```csharp
public class ImageProcessor
{
    private readonly IImageAnalysisService _imageAnalysis;
    private readonly ILogger<ImageProcessor> _logger;

    public ImageProcessor(
        IImageAnalysisService imageAnalysis,
        ILogger<ImageProcessor> logger)
    {
        _imageAnalysis = imageAnalysis;
        _logger = logger;
    }

    public async Task ProcessMarkdownImagesAsync(string markdownPath)
    {
        var imageDir = Path.Combine(Path.GetDirectoryName(markdownPath)!, "images");
        if (!Directory.Exists(imageDir)) return;

        var images = Directory.GetFiles(imageDir, "*.*")
            .Where(f => IsImageFile(f));

        foreach (var imagePath in images)
        {
            try
            {
                var result = await _imageAnalysis
                    .AnalyzeWithClassificationFromFileAsync(imagePath);

                _logger.LogInformation(
                    "Processed {File}: {Type} ({Confidence:P0})",
                    Path.GetFileName(imagePath),
                    result.ContentType,
                    result.ContentTypeConfidence);

                // Store alt text for later use
                await SaveAltTextAsync(imagePath, result.AltText);
            }
            catch (Exception ex)
            {
                _logger.LogWarning(ex, "Failed to process {File}", imagePath);
            }
        }
    }

    private static bool IsImageFile(string path)
    {
        var ext = Path.GetExtension(path).ToLowerInvariant();
        return ext is ".jpg" or ".jpeg" or ".png" or ".gif" or ".webp" or ".bmp";
    }
}
```

# لجنة البلدان

## ما يمكن توقعه

قيمة نموذجية قياسية
|--------|--------------|
□ الدرجة الأولى □ المبطّل (<800MB تنزيل نموذج) □
○ حمولة نموذجية
□ المعالجة بالجليد الواحد للمعالجة □ 500-2000ms □
□ استخدام ذاكرة □ 2GB + موصى به □
□ حيز القرص في الفضاء حوالي 800 ميغابايت للنماذج □

## نصوص الإنتاج

```csharp
// 1. Register as Singleton (model load is expensive)
builder.Services.AddAltTextGeneration(); // Already singleton internally

// 2. Check readiness before processing
if (!_imageAnalysis.IsReady)
{
    return StatusCode(503, "AI model still initializing");
}

// 3. Use cancellation tokens for timeouts
var cts = new CancellationTokenSource(TimeSpan.FromSeconds(30));
var altText = await _imageAnalysis.GenerateAltTextFromUrlAsync(url, cts.Token);

// 4. Process in batches, not parallel (memory constraints)
foreach (var image in images)
{
    await ProcessImageAsync(image); // Sequential is safer
}
```

# تكامل فتح TTTTTeed

وتشمل الحزمة التعقب الداخلي:

```csharp
builder.Services.AddOpenTelemetry()
    .WithTracing(tracing =>
    {
        tracing.AddSource("Mostlylucid.LlmAltText");
    });
```

**الأنشطة التعقبية:**

- `llmalttext.generate_alt_text`
- `llmalttext.extract_text`
- `llmalttext.analyze_image`
- `llmalttext.classify_content_type`

# فحص صح فحص

إضافة a صح تفقّد إلى رصد نموذج حالة:

```csharp
public class AltTextHealthCheck : IHealthCheck
{
    private readonly IImageAnalysisService _service;

    public AltTextHealthCheck(IImageAnalysisService service)
        => _service = service;

    public Task<HealthCheckResult> CheckHealthAsync(
        HealthCheckContext context,
        CancellationToken cancellationToken = default)
    {
        return Task.FromResult(_service.IsReady
            ? HealthCheckResult.Healthy("Florence-2 model ready")
            : HealthCheckResult.Unhealthy("Model not initialized"));
    }
}

// Registration
builder.Services.AddHealthChecks()
    .AddCheck<AltTextHealthCheck>("alttext");
```

# تنفيذ

## 

```
Error: Failed to download model files
```

**الحلول:**

- & مُراسل الإنترنت
- & مُصدّق & مُصدّق و المُثبِّث
- ضمان توافر حيز لـقرص 
- جاري تحرير كِ هذا الأمر `ModelPath`

## & غير جاهز

```csharp
_imageAnalysis.IsReady // Returns false
```

**الحلول:**

- (1-3 ثوان)
- 
- تم التحقق من ذاكرة كافية

## & هذا نص

**الحلول:**

-  `MORE_DETAILED_CAPTION` (الناقص)
- تأكّد أنّ الأمر واضح
- ليس صغيراً جداً أو مجلّد

## لا يعمل

**الحلول:**

- أولا - `EnableTagHelper = true`
- 1 ف-3 1 ف-3 1 ف-3 1 ف-3 1 ف-3 1 ف-3 1 ف-3 1 ف-3 1 ف-3 1 ف-3 1 ف-3 1 ف-3 1 ف-3 1 ف-3 1 ف-3 1 ف-3 1 ف-3 1 ف-3 1 ف-3 `@addTagHelper` ع ع ع ع ع ع `_ViewImports.cshtml`
- لا دعم
- 1 ف-3 1 ف-3 1 ف-3 1 ف-3 1 ف-3 1 ف-3 1 ف-3 1 ف-3 1 ف-3 1 ف-3 1 ف-3 1 ف-3 1 ف-3 1 ف-3 1 ف-3 1 ف-3 1 ف-3 1 ف-3 1 ف-3 `AllowedImageDomains` الإعداد

# أفضل الممارسات

هذا نص هو a نقطة بداية لـ لـ أفضل النتائج:

1. **استعراض الناتج** -المُعَامِلُ لَيسَ مثاليَ، دقّة مؤكّدَة
2. **يبقيه مقتضِصاً** - 90 - 100 كلمة كحد أقصى
3. **لا تكون وصفية** - بما في ذلك المواضيع والإجراءات والسياق
4. **المُحكِّل** -لا تبدأ بـ "الذاكرة لـ ...
5. **واو -** - يجب أن يخدم النص البديل دور الصورة في الصفحة
6. **لا خان لـ مُززِل** - مجموعة `alt=""` لصور تزخرية محضة
7. **نص** - إذا كانت الصورة تحتوي على نص، فضمه

# ثالثاً - استنتاج

`Mostlylucid.LlmAltText` يمكن الحصول على تطبيقاتك على شبكة الإنترنت بواسطة AI-E-Ente دون أي قلق من التكاليف أو الخصوصيات الخاصة لمؤشرات المعلومات المسبقة المسبقة الخارجية. `<img>` العلامات تحصل على نص تلقائي.

الحزمة غير مرخصة (مجال عام)، لذا افعل بها ما تشاء.

## الموارد الخارجة عن

- **المجموعة::** [اللملمAllt text](https://www.nuget.org/packages/Mostlylucid.LlmAltText)
- **المصدر: المصدر:** [مواد تغليف النبتات](https://github.com/scottgal/mostlylucid.nugetpackages/tree/main/Mostlylucid.LlmAltText)
- **قضايا:** [GitHub قضايا](https://github.com/scottgal/mostlylucidweb/issues)
- **فلورنسا - 2:** [نموذج لغوي ميكرو مايكروسوس (Microsof](https://huggingface.co/microsoft/Florence-2-base)