네트워크를 통해 비트맵 이미지 전송

4234 단어



Pexels의 Sora Shimazaki님의 사진

이미지는 픽셀(색상의 작은 점)으로 구성됩니다. 이미지는 비트맵으로 디지털 방식으로 저장할 수 있습니다.



비트맵(Bit-Map)은 도메인을 비트로 매핑한 것입니다. 우리의 경우 도메인은 픽셀 배열이며 여기서는 단일 비트를 픽셀에 매핑합니다.
Pix-map은 여러 비트를 픽셀에 매핑하는 픽셀 맵입니다.

비트맵은 24비트 또는 32비트 색상 심도를 사용하고 RGB(255, 255, 255) 색상 시스템을 사용합니다. RGB 색상 시스템의 각 값은 바이트(8비트)로 저장되며, 추가 8비트는 이미지의 투명도를 표시하는 데 사용될 수 있습니다. 영상

R =8bits
G=8bits
B=8bits #24bit
A=8bits #32bit #extra transparency bit


이미지를 비트맵 형식으로 저장하면 이미지가 매우 커지므로 이미지는 대부분 압축 파일 형식으로 저장됩니다.
.PNG::무손실 압축. 패턴 주석 픽셀 색상을 사용하여 데이터를 압축하여 저장되는 데이터의 양을 줄입니다. readmore .
.jpg::손실 압축. 인간의 눈으로 식별할 수 없는 색상을 제거하여 데이터를 압축합니다. read more .

이제 우리는 네트워크를 통해 이미지를 보내는 프로그램을 작성할 것입니다. 따라서 UDP를 사용하여 네트워크를 통해 이미지를 보내고 직렬화를 위해 pickle도 사용할 것입니다.
  • 소켓을 생성하는 주먹sockfd = socket(AF_INET, SOCK_DGRAM)
  • 보낼 이미지 열기image = Image.open("image.png")
  • 이미지의 크기 즉, 너비 및 높이 가져오기width, height = image.size
  • 전체 이미지를 반복합니다(이미지가 2차원 배열 형식이기 때문에 두 개의 루프가 있는 이유)
  • 이미지에 있는 모든 픽셀의 RGB 값 가져오기rgba = image.getpixel(pos)
  • 픽셀 모듈에서 "덤프"를 사용하여 전송 가능한 형태로 변경msg = dumps(message)
  • 보내는 중 sockfd.sendto(msg, ("127.0.0.1", 9999))


  • 우리가 보내는 이미지



    from socket import *
    from pickle import *
    from PIL import Image
    import time
    
    #create a socket
    
    sockfd = socket(AF_INET, SOCK_DGRAM)
    
    #open image
    image = Image.open("100kb.png")
    
    #get image size
    width, height = image.size
    print(image.size)
    
    for x in range(width):
        for y in range(height):
    
            #get the position in the two dimensional array
            try:
                pos = (x, y)
                rgba = image.getpixel(pos)
    
                message = (pos, rgba)
                msg = dumps(message)
                sockfd.sendto(msg, ("127.0.0.1", 9999))
                time.sleep(0.001)
            except:
                print(1)#just a check
    
    
    
    

  • 이제 이미지를 받으려면…
  • 소켓 생성
  • 바인드 소켓
  • 전송된 데이터를 저장할 이미지 파일을 생성합니다image4 = Image.new("RGBA", size=(width, height)).
  • 데이터를 수신하고 이미지 파일에 쓰는 함수를 만듭니다
  • .

    여기에서는 너비와 높이를 이미 알고 있었지만 픽셀 데이터를 보내기 전에 네트워크를 통해 보낼 수도 있습니다.

    from socket import *
    from pickle import *
    from PIL import Image 
    
    
    
    #viewer = ImageViewer()
    sockfd = socket(AF_INET, SOCK_DGRAM)
    sockfd.bind(("127.0.0.1", 9999))
    
    height = 170
    width = 272
    isize = (height, width)
    #image = open("image2.png", "x")
    image4 = Image.new("RGBA", size=(width, height))
    pixels = image4.load()
    
    def get_pixel_data():
        while True:
            msg, cli_addr = sockfd.recvfrom(1024)
            #decoding 
            message = loads(msg)
            pos = message[0]
            rgba = message[1]
            print(pos)
            pixels[pos[0], pos[1]] = rgba
            #print(pixels[pos[0], pos[1]])
            if pos[0] + 1 == width and pos[1] + 1 == height:    
                image4.save("image4.png")
                break
    #calling my function
    get_pixel_data()
    
    
    


    우리가 받은 이미지





    이것은 즐거웠습니다. 제 글에서 배웠기를 바랍니다. 의견을 남기거나 저에게 연락하십시오.

    좋은 웹페이지 즐겨찾기