2013-08-14 4 views
0

나는 이동이 같은 STH을하고 싶습니다 :이미지의 픽셀 값을 수정할 수 있습니까?

for x := 0; x < width; x++ { 
    for y := 0; y < height; y++ { 
      // something similar to this: 
      src_img[x, y] = color.Black 
    } 
} 

은 "이미지/JPEG", "이미지/색상을"전용 "이미지"를 가져,이 작업을 수행 할 수 있습니까? 예를 들어

답변

2

:

package main 

import (
     "fmt" 
     "image" 
     "image/color" 
) 

func main() { 
     const D = 12 
     img := image.NewGray(image.Rect(1, 1, D, D)) 
     for x := 1; x <= D; x++ { 
       img.Set(x, x, color.Gray{byte(2 * x)}) 
     } 
     for x := 1; x < D; x++ { 
      fmt.Printf("[%2d, %2d]: %5v\n", x, x, img.At(x, x)) 
     } 
} 

Playground


출력 :에 별도로 (The Go image package 기사를 읽는

[ 1, 1]: { 2} 
[ 2, 2]: { 4} 
[ 3, 3]: { 6} 
[ 4, 4]: { 8} 
[ 5, 5]: { 10} 
[ 6, 6]: { 12} 
[ 7, 7]: { 14} 
[ 8, 8]: { 16} 
[ 9, 9]: { 18} 
[10, 10]: { 20} 
[11, 11]: { 22} 

를 사용상).

+0

감사합니다,하지만 난이 – bee

+0

의 차이점은 무엇 하나의 새로운 생성하지, 이미지의 픽셀 '값이 파일에서로드 수정 하시겠습니까? image.Decode를 사용하여 그림을로드하고 적절한 형식을 지정하고 위의 그림과 같은 .Set 메서드를 사용합니다. – zzzz

1

image.RGBA 형식은 이미지를 수정하려는 경우 이미지를 메모리에 저장하는 가장 좋은 방법입니다.

Set(x, y int, c color.Color) 

불행하게도 모든 디코더는 RGBA 형식으로 이미지를 반환하는 없습니다 : 그것은 픽셀을 설정하기위한 편리한 방법을 가지고 draw.Image 인터페이스를 구현합니다. 그 중 일부는 모든 단일 픽셀을 수정할 수없는 압축 된 형식으로 이미지를 남깁니다. 읽기 전용 유스 케이스가 많으면 빠릅니다. 그러나 이미지를 편집하려면 복사해야 할 수도 있습니다. 예를 들어 :

src, _, err := image.Decode(file) 
if err != nil { 
    log.Fatal(err) 
} 
rgba, ok := src.(*image.RGBA) 
if !ok { 
    b := src.Bounds() 
    rgba = image.NewRGBA(image.Rect(0, 0, b.Dx(), b.Dy())) 
    draw.Draw(rgba, rgba.Bounds(), src, b.Min, draw.Src) 
} 
// rgba is now a *image.RGBA and can be modified freely 
rgba.Set(0, 0, color.RGBA{255, 0, 0, 255}) 
+0

답변 해 주셔서 감사합니다. 따라서 이미지를 복사하지 않고 편집 할 수있는 다른 방법은 없습니까? 내 응용 프로그램은 이미지를 처리하지만 확실히 일부 C 또는 C++ 코드와 연결합니다. Go가 어떻게 반응하는지, 예를 들어 for를 사용하는지 몇 가지 테스트를해야합니다. 1600x1000 그림 효과가 크지 만 크고 무거운 것을 (5400x3600) 사용하면 속도가 느려집니다. 그리고 저는 앞으로 40 장 정도의 이미지를 가질 수 있으므로 40 장의 이미지를 복사하는 것이 복잡해지고 있습니다. – bee

관련 문제