Golang конвертирует необработанный байт изображения [] в изображение.

image go

4519 просмотра

1 ответ

41874 Репутация автора

Предположим, у меня есть 8-битное изображение в градациях серого, например:

var pixels []byte = ...
width := 100
height := 100

Как я могу преобразовать это в то, что реализует image.Image?

Автор: Timmmm Источник Размещён: 18.07.2016 01:48

Ответы (1)


7 плюса

205945 Репутация автора

Решение

imageПакет имеет несколько реализаций image.Imageинтерфейса.

Если вы можете найти реализацию, которая моделирует пиксели так же, как она у вас есть, вам не нужно ничего делать, просто используйте эту реализацию.

Например, imageпакет имеет image.Grayтип, который реализует, image.Imageи он моделирует пиксели с одним байтом, являющимся 8-битным цветом в градациях серого.

Так что если у вас есть именно это, просто создайте значение image.Grayи «скажите это», чтобы использовать pixels:

pixels := make([]byte, 100*100) // slice of your gray pixels, size of 100x100

img := image.NewGray(image.Rect(0, 0, 100, 100))
img.Pix = pixels

Примечание № 1:

Обратите внимание, что я использовал, image.NewGray()который возвращает вам инициализированное значение image.Gray, поэтому нам нужно было только установить / изменить срез пикселей. Поскольку image.Grayэто структура с экспортируемыми полями, мы также можем создать ее, вручную инициализировав все ее поля:

img := &image.Gray{Pix: pixels, Stride: 100, Rect: image.Rect(0, 0, 100, 100)}

(Обратите внимание, что я использовал указатель, потому что *image.Grayреализует только image.Imageкак методы, определенные с получателем указателя. image.NewGray()Также возвращает указатель.)

Заметка 2:

В наших примерах мы устанавливаем pixelsсрез, который будет использоваться изображением. Изображение теперь привязано к этому срезу. Если мы что-то изменим в нем, то и пиксель, который Image.At()будет возвращен, также изменится (они используют один и тот же источник). Если вы не хотите этого, вы можете скопировать пиксели в Gray.Pixсрез следующим образом:

img := image.NewGray(image.Rect(0, 0, 100, 100))
copy(img.Pix, pixels)

Попробуйте эти примеры на игровой площадке Go .

Автор: icza Размещён: 18.07.2016 02:05
Вопросы из категории :
32x32