Forma rápida de intercambiar bytes rojos/azules usando scanline
Pregunta
Actualmente, enojo el Canvas.Pixels[]
propiedad y lea cada píxel en un lienzo para intercambiar bytes rojos/azules (por razones específicas). Sin embargo, toma un promedio de 2 segundos por imagen, y tengo más de 8,000 imágenes que necesito para convertir (durante la noche). Entiendo que puedo usar un método de ScanLine
para lograr esto mucho más rápido, pero no sé nada sobre ScanLine
- Es un nivel mucho más bajo de codificación del que me siento cómodo. ¿Cuál es la forma más rápida de lograr esto? Estoy dispuesto a esperar un tiempo para que esto se ejecute, pero aún así sería bueno si pudiera cortar ese tiempo a la mitad o más.
En este momento, este es el procedimiento que uso:
procedure SwapBytes(var Bmp: TBitmap);
var
X, Y: Integer;
R, G, B: Byte;
C: TColor;
begin
for Y := 0 to Bmp.Height - 1 do begin
for X := 0 to Bmp.Width - 1 do begin
C:= Bmp.Canvas.Pixels[X,Y];
R:= GetRValue(C);
G:= GetGValue(C);
B:= GetBValue(C);
Bmp.Canvas.Pixels[X,Y]:= RGB(B, G, R)
end;
end;
end;
Nota adicional: Una conversión inicial de más de 8,000 imágenes es el primer paso de por qué necesito esto. Sin embargo, también usaré lo mismo en nuestro software para convertir automáticamente cualquier imagen en el lugar, según sea necesario. Entonces, un convertidor de terceros no funcionará, porque no puedo distribuir esto a nuestros clientes.
No hay solución correcta