Файл .BMP: анализ и преобразование

#haskell #bmp #bytestring

#haskell #bmp #байтовая строка

Вопрос:

Моя цель — иметь возможность анализировать и преобразовывать графические файлы, ориентируясь на цветовую матрицу.

  1. Что лучше использовать Word8 или целочисленную матрицу?
  2. Как еще мы можем переключиться с байтовой строки на двумерную матрицу?
  3. Являются ли используемые процедуры наиболее эффективными?

?

 bmpToMatrix :: FilePath -> IO (Matrix [Integer])
bmpToMatrix input = do
    Right bmp  <- readBMP input
    let rgbas   =  unpackBMPToRGBA32 bmp
        (width, height) = bmpDimensions bmp
        integers =  BS.foldr ((:) . toInteger) [] rgbas
    return $ MT.fromList height width $ SP.chunksOf 4 integers

bmpEdit :: (Matrix [Integer] -> Matrix [Integer]) -> FilePath -> FilePath -> IO ()
bmpEdit f input output = do
    matrix <- bmpToMatrix input
    let matrix' = f matrix
    matrixToBMP output matrix'

matrixToByteString :: Matrix [Integer] -> ByteString 
matrixToByteString = BS.pack . L.concatMap (L.map fromIntegral) . MT.toList

matrixToBMP :: FilePath -> Matrix [Integer] -> IO ()
matrixToBMP output mt =
    writeBMP output $ packRGBA32ToBMP (ncols mt) (nrows mt) $ matrixToByteString mt
  

Комментарии:

1. Я не вижу никакой чистой функции. У вас есть какие-либо причины для этого?

2. Думаю, я не совсем понял ваше замечание. Однако, если вы хотели сказать, что не существует функций для манипулирования матрицей rgba, это связано с тем, что для меня опубликованные мной функции служат рабочей «средой». Если вместо этого вы имеете в виду, что матрица привязана к целочисленному типу (а не, например, к типу Int), это потому, что функция преобразования матрицы (библиотека матриц) требует целочисленного типа. Я думаю, что при работе с массивом у меня не было бы этого ограничения.

3. У вас есть какая-нибудь реальная проблема?

4. Что такое Matrix ? Я бы ожидал Matrix Integer вместо Matrix [Integer] .

5.Я проголосовал за закрытие как слишком широкое, потому что это так. Но вкратце: Is it better to operate a Word8 or Integer matrix? Word8 можно распаковать, пока Integer этого не произойдет. How else can we switch from ByteString to a two-dimensional matrix? Существует бесконечное количество способов, почему вы спрашиваете? Are the procedures used the most efficient? Списки номеров, очевидно, не будут «наиболее эффективными» — рассмотрите упакованные структуры значений word8. Рассмотрим меньшие по размеру, особенно автономные, примеры.