Color theory readings
What resources can be found online and in libraries to help understand some color theory ?
What resources can be found online and in libraries to help understand some color theory ?
This page addresses most of the mistakes and misconceptions about Ansel that can be found online.
Este artigo documenta a matemática atualmente implementada no módulo diffuse or sharpen do Ansel, tal como se encontra em src/iop/diffuse.c, src/common/bspline.h, data/kernels/diffuse.cl e data/kernels/bspline.cl. Não é um guia de uso. É uma reconstrução do modelo numérico a partir do código-fonte, com as afirmações científicas rastreadas até as referências citadas nos comentários do código.1
Este artigo apresenta a matemática da reconstrução de realces do Ansel : o projeto original de 2021 dos guided laplacians, cujas ideias gerais só tinham sido esboçadas no fórum pixls.us,1 e a transposição harmônica, o método que o substituiu depois que um estudo com verdade de referência (ground truth) expôs um bug de recuperação de magnitude.2 Está organizado de modo que cada leitor encontre sua seção : os resultados e a seção Intuição e contexto de cada método não exigem matemática ; desenvolvedores encontrarão as subseções Implementação e otimizações e o estudo de desempenho ; as conclusões teóricas e o anexo do cemitério foram escritos para serem reutilizáveis fora da fotografia ; e como este trabalho foi de fato realizado documenta o protocolo de pesquisa homem–máquina por trás dele.
O Linux ainda está muito atrás do MacOS e até mesmo do Windows quando se trata de garantir a consistência das cores exibidas no monitor. A adoção amplamente forçada do servidor gráfico Wayland na maioria das distribuições Linux prejudicou ainda mais esse cenário, já que o gerenciamento de cores foi por muito tempo recusado pelos desenvolvedores do Wayland. A especificação de um CMS no Wayland foi finalmente rascunhada em 2020 e o código foi mesclado ao Wayland upstream em 2025, por colaboradores externos, e após uma longa batalha dos desenvolvedores dos softwares de CMS anteriores contra os desenvolvedores históricos do Wayland.1 Desde então, o estado do suporte a CMS é muito irregular entre os diversos ambientes de área de trabalho e distribuições. E, ainda assim, os resultados preliminares da telemetria do Ansel mostram 67 % de adoção do Wayland entre os usuários do Ansel.
Jiyoné (Guillaume Stutin) assumiu a manutenção do Ansel desde outubro de 2025. O objetivo atual é transformar o Ansel em uma cooperativa na qual os usuários possam se tornar membros e controlar democraticamente as orientações e prioridades do projeto, mas também garantir uma retribuição justa e um ambiente de trabalho seguro para aqueles que dedicam sua força de trabalho ao projeto. Apresentei a descrição do problema e a solução proposta na página democracia.
Compilar o software nativamente no computador costumava melhorar o desempenho na CPU em cerca de 30 %, em comparação com pacotes pré-compilados. O motivo é que o compilador faz otimizações específicas para o hardware alvo no qual é compilado, enquanto os pacotes pré-compilados precisam permanecer genéricos e acionar otimizações mais conservadoras em prol de um suporte amplo. Note que os kernels OpenCL são, de qualquer forma, compilados para a sua GPU específica usando o seu driver OpenCL, então a história é diferente nesse caso.
Em seu livro, A Sociedade Tecnológica (1954), Jacques Ellul apresenta a diferença entre o período pré e pós-revolução industrial da seguinte forma:
A era pré-industrial é o reinado da ferramenta e do artesanato. A propriedade principal das ferramentas é serem genéricas, versáteis e adaptáveis. Cabe ao artesão desenvolver suas habilidades para fazer as ferramentas seguirem sua intenção, de modo que a mão compense as limitações do instrumento. Esse conceito ainda é bem conhecido pelos músicos hoje: você tem que praticar, aprender, tentar, falhar, tentar de novo… não há atalhos. Ellul enfatiza a ideia de parcimônia que acompanha as ferramentas: os recursos são limitados, então seu conjunto de ferramentas é praticamente definido pelo que você pode pagar, carregar, dominar e construir localmente. As tendências mudam lentamente e são locais, porque usam recursos locais e se adaptam a necessidades locais, e as ferramentas seguem o mesmo padrão. As ferramentas são heranças passadas de mestre para aprendiz, de pai para filho. Elas não se tornam incompatíveis nem obsoletas.
Entre janeiro de 2022 e março de 2026, o Ansel integrou 297 commits (sem contar merges) referentes à grade da mesa de luz, suas miniaturas e seu pipeline de renderização e caching. Tentei me virar com o desleixado código da mesa de luz do Darktable, apenas desengordurado, pelo maior tempo que consegui, mas infelizmente era pura dívida técnica e era dolorosamente lento.
De fato, o Darktable “gerencia” a porcaria de sua mesa de luz reduzindo o tamanho dela: os painéis laterais esquerdo e direito ocupam bastante superfície de exibição, o que deixa uma área ainda menor para a mesa de luz repintar. Como o Ansel removeu o painel lateral direito, fundindo seu conteúdo com o esquerdo e com o menu global, havia mais superfície para pintar, mais trabalho de CPU a fazer, e o péssimo design da mesa de luz tornou-se ainda mais prejudicial.
Desde que comecei a usar o Darktable, por volta de 2012, sempre me surpreendi com a pouca quantidade de RAM que ele usava. As pessoas acham que é uma coisa boa um aplicativo usar a memória com parcimônia, e isso certamente é verdade quando falamos do seu ambiente de trabalho. Mas, tratando-se de um software de produção que faz renderização pesada de pixels em imagens de 12 a 54 Mpixels, isso significa que os mesmos cálculos pesados são feitos repetidamente em vez de serem salvos para reutilização posterior. É para isso que serve um cache: evitar cálculos custosos. E ele deveria usar toda a RAM disponível para isso, porque computar é desperdiçar energia, e isso tem um impacto concreto se você está trabalhando na bateria. Além disso, você pagou por essa RAM e usá-la não esvazia sua bateria. A CPU/GPU, por outro lado…
Memórias de um cara que passou tempo demais limpando a merda dos outros e pagando pelas más decisões deles, episódio #tantos que perdi a conta.
Copiar/colar histórico e estilos são recursos centrais no Ansel, e o que faz com que ele mereça (ou não) o título de “aplicativo de fluxo de trabalho”. Mas também está entre os mais difíceis de acertar internamente. Os usuários veem uma lista de edições, mas por baixo dos panos essas edições dependem da ordem do pipeline, das instâncias de módulos e das máscaras. Se duas imagens têm topologias de pipeline diferentes, copiar edições de forma ingênua pode produzir inconsistências.
No meu texto de referência, Darktable: batendo no muro em câmera lenta, apresentei o desastre que era o novo “Grande turducken MIDI”. O propósito desse turducken1 era reescrever o sistema de atalhos de teclado para estendê-lo a dispositivos MIDI.
Até hoje, ainda estou irritado com essa empreitada de destruição em massa; aqui vai um resumo dos motivos:
if/switch-case ilegíveis aninhadas em 4 níveis, no meio de funções de 1000 linhas (postei trechos de exemplo no meu artigo),Keypad End,Shift+&, ou Shift+" no BÉPO,

O grafo de dependências de src/gui/accelerators.c (Grande turducken MIDI) antes da reescrita. Adivinhe por que chamamos isso de “código espaguete "… Isso deixa claro que há uma dependência bidirecional entre o código dos aceleradores e o resto do código da GUI. É um pesadelo de manter.
Depois de finalmente ter interligado todo o site e a documentação a um fluxo de tradução à prova d’água (usando o po4a por cima do Hugo), que por acaso usa exatamente o mesmo conjunto de ferramentas e a mesma lógica do aplicativo Ansel, tive a ideia de automatizar as traduções vazias, primeiro a partir dos arquivos de tradução do software, depois por meio da API do ChatGPT, que faz um trabalho bastante razoável ao traduzir a sintaxe Markdown.
Alain Oguse learned photographic printing with Claudine and Jean-Pierre Sudre in the late 1960’s, and spent his early career in commercial photography. After retiring, he started to investigate how to bring back the photographic (silver halide) grain in digital scans of film negatives, finding the same sharpness and quality he had with near-point light enlargers in the 1970’s.
The point light printing technique uses a very tiny source of light that gives a very precise and detailed reproduction of B&W film negatives, as opposed to diffuse lighting. It is very demanding, as its unforgiving sharpness and contrast do not hide scratches and dust on the film surface. Prints done this way would often need manual (painted) corrections on paper, inducing more work and more costs. By the end of the 1970’s, it was usually replaced by diffuse light… better at hiding manipulation mistakes and at maximizing print labs profits.
Lá em dezembro de 2019, eu pedi que alguém se encarregasse de fornecer pacotes AppImage para o Darktable. O benefício óbvio teria sido possibilitar testes precoces, antes da versão, por parte de pessoas que não conseguem compilar o código-fonte por conta própria, de modo a quem sabe fornecer feedback antecipado e ajudar a depurar antes de lançar. Isso nunca foi uma prioridade, o que significa que estava tudo bem ter uma corrida para corrigir bugs tanto antes quanto depois da versão.
We all know what “white” is. We can picture a white sheet of paper. We know it is white because we learned it. But if you put your paper sheet under a summer sun, or a cloudy sky, or at home with those warm living-room bulbs, that white will change color. It might disturb you for the first few seconds, then you will just forget about it: your brain will adapt. But adapt (to) what ?
This will apply to upstream Darktable as to Ansel since they share most of their color pipeline. The following procedure will help you troubleshoot your color issues, whether it is inconsistent appearance between export vs. preview, or between screen vs. print, or between 2 apps.
The inherent problem of color is it exists only as a perception, and that perception is highly contextual and fluid. If I take any color patch and display it over a white, middle-grey or black background, it will not appear the same even though a colorimeter would confirm it’s the exact same color. I have built a little web animation to showcase this effect, displaying sRGB gamut slices at constant hue, over user-defined background lightness : the sRGB book of color .
…
O Ansel herda do Darktable sua espinha dorsal de banco de dados: os históricos de edição não destrutiva são salvos por imagem em um banco de dados SQLite, junto com metadados e outros dados definidos pelo usuário. Fazer com que o banco de dados reconheça novas imagens é feito através da “importação” de imagens de um disco ou de um cartão de memória. É aí que entra a ferramenta de importação.
mindmap
root((COLOR))
color appearance model
uniform color space
chromaticity
U, V
a, b
lightness
L
delta E
chromatic adaptation transform
illuminant
color reproduction index
color temperature
surround lighting
background lightness
dimensions
Munsell
hue
chroma
value
natural color system
blackness
saturation
hue
CIE
lightness
brightness
saturation
chroma
colorfulness
hue
measure
colorimetry
tristimulus
sensor
Luther-Ives criterion
metamerism
dynamic range
noise
mosaicing
Bayer
XTrans
zipper artifacts
spaces
rgb(RGB)
HSV
HSL
LMS
Yrg
XYZ
Yxy
Yuv
Ych
CYM
CYMK
primaries
cone cells
LED
ITU BT.Rec 709
ITU BT.Rec 2020
DCI P3
inks
spectrometry
light spectrum
wavelengths
energy
photometry
luminance
correction
profile
matrix
lookup table
transfert function
color grading
ASC CDL
channel mixer
curves
white balance
Durante muito tempo, eu achei que houvesse algum mecanismo de kill-switch no pipeline de pixels. O caso de uso é o seguinte:
Nesse caso, você quer encerrar todos os pipelines ativos porque sua saída não será usada, e começar a recalcular tudo imediatamente com os novos parâmetros. Só que o Darktable não faz isso, ele deixa o pipeline terminar antes de reiniciá-lo, e olhando os comentários no código-fonte, parece ser uma regressão bastante recente e não o comportamento originalmente pretendido.
O Darktable tem sua própria biblioteca de widgets de interface, para controles deslizantes e caixas de combinação (também conhecidas como menus suspensos ou caixas de seleção), chamada Bauhaus (no código-fonte, fica em src/bauhaus/bauhaus.c). Embora usem o Gtk como backend, os Bauhaus são objetos personalizados. E, como muitas coisas no Darktable, personalizado é sinônimo de podre.
Em 2022, notei redesenhos parasitas e travamentos ao usá-los, resultando em uma experiência de usuário frustrante: o redesenho do widget parecia esperar a conclusão dos recálculos do pipeline, o que significava que os usuários não tinham certeza se a mudança de valor havia sido registrada, o que podia levá-los a tentar novamente, iniciando outro ciclo de recálculo custoso e efetivamente congelando o computador por vários minutos muito frustrantes de recálculos intermediários e inúteis do pipeline.
O Rawspeed (a biblioteca que fornece os decodificadores para arquivos raw de câmera) descontinuou o suporte ao GCC < 12. Como resultado, não posso mais compilar o AppImage no Ubuntu 20.04 (usando os runners do Github), mas tenho que compilá-lo no 22.04.
Isso significa que qualquer distribuição Linux que tenha a libc mais antiga que a 2.35 não conseguirá iniciar os novos AppImages a partir de hoje. Isso não deve afetar a maioria dos usuários que rodam distribuições atualizadas em 2021 ou mais recentemente. O Ubuntu 20.04 e outras distribuições LTS/estáveis antigas (Debian stable) podem ser afetadas.
The scene-referred workflow promises an editing independent from the output medium. It will typically produce an image encoded in sRGB colorspace with 8 bits, that is code values between 0 and 255. To simplify, we will consider here only the 8 bits case. Concepts are the same in 16 bits, only the coding range goes from 0 to 65535, which is anecdotal.
Unfortunately, nothing guarantees that the printer is able to use the whole encoding range. The minimum density (Dmin in analog) is reached with naked paper, and matches an RGB code value 255. The maximum density (Dmax in analog) is reached with 100% ink coverage.1 Problem is, if Dmin matches an RGB code value of 255, Dmax never matches an RGB value of 0.
Se você vem do Darktable, talvez esteja acostumado com isto na sala escura:

enquanto o Ansel oferece isto a você:

Isso não é por acaso, e chegou a hora de explicar por quê, e por que isso não será estendido com opções de personalização.
Descobri por acaso que o script de compilação do Linux usava uma compilação “package”, o que significa que as otimizações de CPU ficam limitadas às genéricas, a fim de produzir binários portáteis que podem ser instalados em qualquer plataforma x86-64. Por “usava”, quero dizer que a compilação package não estava explicitamente desativada, então ficava ativada por padrão.
De qualquer forma, isso agora está desativado por padrão, já que os pacotes de fato (.exe e .appimage) não são compilados através desse script, que se destina principalmente a ajudar os usuários finais. Para recuperar o comportamento anterior, você precisaria executar:
2022 foi tão ruim em termos de e-mails inúteis e ruído que comecei o Virtual Secretary , um framework em Python para escrever filtros de e-mail inteligentes cruzando informações entre várias fontes para adivinhar o que os e-mails recebidos são e se eles são importantes/urgentes ou não. Quando falo de e-mails inúteis, são também notificações do Github, pings no pixls.us (graças a Deus fechei minha conta naquele fórum idiota), YouTube e e-mails diretos de pessoas esperando conseguir alguma ajuda em particular.
Here is how to get started with Ansel editing, going through only the most basic steps that should serve you well most of the time.
The video was recorded on Darktable 3, but the same modules and principles apply to Ansel.
This article will demonstrate how to perform monochrome toning on digital images in Ansel, to emulate the color rendition of cyanotypes, platinotypes, sepia and split-toning developments.
Set the global exposure and filmic scene white and scene black, as in any other editing. See basic editing steps. This is our base image, by Glenn Butcher :

Faz aproximadamente 3 meses que renomeei o “R&Darktable” (que ninguém parecia entender direito) para “Ansel”, depois comprei o nome de domínio e criei o site do zero com o Hugo (eu nunca havia programado em Golang antes, mas é basicamente código de template).
Depois gastei um total de 70 h fazendo os builds noturnos dos pacotes para Windows e Linux funcionarem para entrega contínua, algo que o Darktable nunca acertou (“você pode compilar por conta própria, não é difícil”), só para ver o rastreador de bugs explodir depois do lançamento (nada melhor do que encadear a maratona de pré-lançamento com uma de pós-lançamento para reduzir sua expectativa de vida).
O que acontece quando um bando de fotógrafos amadores, transformados em desenvolvedores amadores, acompanhados por uma turma de desenvolvedores de back-end que criam bibliotecas para desenvolvedores, decide trabalhar sem método nem estrutura em um software profissional destinado a usuários finais, cuja competência central (colorimetria e psicofísica) situa-se em algum ponto entre uma graduação em fotografia e um mestrado em ciências aplicadas, ao mesmo tempo que promete entregar 2 versões por ano sem gestão de projeto? Tudo isso, é claro, em um projeto de onde os fundadores e a primeira geração de desenvolvedores seguiram em frente e fugiram?
In this article, you will learn what the scene-referred workflow is, how Ansel uses it and why it benefits digital image processing at large.
The scene-referred workflow is the backbone of the Ansel’s imaging pipeline. It is a working logic that comes from the cinema industry, because it is the only way to achieve robust, seamless compositing (also known as alpha blending) of layered graphics, upon which movies rely heavily to blend computer-generated special effects into real-life footage. For photographers, it is mostly for high dynamic range (HDR) scenes (backlit subject, sunsets, etc.) that it proves itself useful.
You can also ask Chantal, the AI search engine.
(section) •(summary)