Send the image, not just its filename
Use a vision-capable model and an interface that actually attaches the image. A text-only model cannot see a picture because you mention its path. With Ollama's direct REST API, the image must be base64 data in the message's images array; official SDKs handle file paths differently. See the vision instructions.
Start with an existing Ollama installation, an already downloaded local vision model and one small PNG or JPEG you may process. Check the image opens normally. These instructions were source-checked on 12 October 2026; no image inference, model download or quality benchmark was executed for this answer.
1. Confirm the model and where it runs
In a terminal, run:
ollama --version
ollama ls
ollama show YOUR_EXISTING_MODEL_TAG
Replace the placeholder with the complete tag from your list. Check capabilities include vision, not just completion. The CLI reference documents listing and multimodal use; model details exposes capabilities through POST /api/show too.
A listed entry can point to a cloud model. For this local example, choose weights already on your computer and your own local server. Use our local-or-cloud check if uncertain: a localhost address alone does not prove inference stays on your PC. If no suitable local vision model is installed, assess its hardware, licence and download requirements separately before proceeding.
2. Try the app or CLI first
In Ollama's Windows/macOS chat app, select the confirmed vision model, attach your image by drag and drop, then ask: “Describe the main objects. If text is unreadable, say so.” Confirm the attachment appears before sending. Ollama's app announcement documents image support with compatible models; another frontend may handle attachments differently.
For the CLI, put image.png in your terminal's working folder and substitute your existing tag:
ollama run YOUR_EXISTING_MODEL_TAG "./image.png Describe the main objects."
Use a simple filename for this first check. The vision quick start demonstrates an image path with the question. If downloading starts unexpectedly, cancel and check the tag. Copy the answer separately; the API route below makes export explicit.
3. Save an answer with Windows PowerShell
Keep your local Ollama server running at its usual port, 11434. Open PowerShell in a separate working folder and paste this complete block. Enter the exact installed model tag and full image path without surrounding quotes; spaces in the path are handled.
$ErrorActionPreference = 'Stop'
$visionModel = (Read-Host 'Exact installed local vision model tag').Trim()
$visionPath = (Resolve-Path -LiteralPath (Read-Host 'Full image path')).ProviderPath
$visionOutput = Join-Path (Get-Location).Path 'ollama-image-answer.txt'
if (Test-Path -LiteralPath $visionOutput) {
throw 'Output exists. Choose a new working folder before another run.'
}
$visionApi = 'http://127.0.0.1:11434'
$visionModels = Invoke-RestMethod -UseBasicParsing -Uri "$visionApi/api/tags"
if (@($visionModels.models.name) -notcontains $visionModel) {
throw 'Exact model tag is not listed on this server.'
}
$visionShowBody = @{model = $visionModel} | ConvertTo-Json
$visionInfo = Invoke-RestMethod -UseBasicParsing -Method Post `
-Uri "$visionApi/api/show" -ContentType 'application/json; charset=utf-8' `
-Body $visionShowBody
if ($visionInfo.remote_host -or $visionInfo.remote_model) {
throw 'This entry advertises a remote model. Select local weights.'
}
if (@($visionInfo.capabilities) -notcontains 'vision') {
throw 'This model does not advertise vision support.'
}
$visionBytes = [System.IO.File]::ReadAllBytes($visionPath)
if ($visionBytes.Length -eq 0) { throw 'Image file is empty.' }
$visionBase64 = [Convert]::ToBase64String($visionBytes)
$visionBody = @{
model = $visionModel
stream = $false
messages = @(@{
role = 'user'
content = 'Describe the main objects. Say if text is unreadable.'
images = @($visionBase64)
})
} | ConvertTo-Json -Depth 8
$visionResult = Invoke-RestMethod -UseBasicParsing -Method Post `
-Uri "$visionApi/api/chat" -ContentType 'application/json; charset=utf-8' `
-Body $visionBody -TimeoutSec 300
if ($visionResult.done -ne $true -or
[string]::IsNullOrWhiteSpace($visionResult.message.content)) {
throw 'No complete text answer returned; inspect the response.'
}
$visionText = [System.Text.Encoding]::UTF8.GetBytes($visionResult.message.content)
$visionFile = [System.IO.File]::Open($visionOutput, [System.IO.FileMode]::CreateNew)
try { $visionFile.Write($visionText, 0, $visionText.Length) }
finally { $visionFile.Dispose() }
Get-Content -LiteralPath $visionOutput -Encoding UTF8
The model-list endpoint supplies available names. Remote fields are defined in Ollama's API source; their absence is not a universal privacy audit. Confirm your local setup before sending private material.
The block reads the image's bytes and encodes them. Putting C:/Pictures/image.png directly in REST images would send a string rather than attach those bytes. Base64 is encoding, not encryption. stream = false requests one JSON response; the answer comes from message.content, as documented by the chat API.
Microsoft's REST documentation, base64 method and file-creation modes support the Windows mechanics. CreateNew refuses to replace an existing export. The five-minute timeout is an example boundary, not a measured completion time.
4. Reopen and check the answer
Open ollama-image-answer.txt in a text editor and compare it with the original image. Check names, numbers and claimed details. A completed request proves it returned text, not that the description is accurate. For tiny print, try an original-resolution crop of the relevant region and preserve both inputs; enlarging a picture does not restore absent detail.
Keep the image, answer, prompt, model tag/ID and Ollama version together. For document text rather than a general description, our PDF extraction/OCR answer covers that separate input problem.
Fix the failure you actually see
- Connection refused: confirm your own server is running and its configured address/port. The Windows guide documents local API access. Do not start a second server blindly.
- Model not listed or no vision capability: check the exact tag and variant. Other sizes in a model family need not support images.
- Invalid image/base64: reopen the file, confirm it is a real supported image and send encoded bytes, not a path or webpage. Keep the exact error; see API errors.
- Memory failure or timeout: retain the error and use our Ollama memory checks. Repeatedly queuing the failure adds no diagnosis.
Local or hosted?
An already installed local model avoids hosted inference charges; hardware, storage and electricity still matter. Ollama Cloud is an alternative when local hardware is unsuitable, provided the hosted model supports images. Its pricing describes starter usage and paid credits/subscriptions; check the exact model and account allowance before uploading. Hosted processing sends the image and prompt to the provider, including through a local server. No hosted route, charge or comparative quality was tested here.
Sources
Primary references checked 12 October 2026. This explanation is not a benchmark of a particular model or computer.