注意:這是一項與學校相關的作業,我沒有能力尋找直接答案。尋求對演算法的支持,因為這是我第一次提出這樣的問題
程式 預期目的:獲取命令列提供的影像并將其放大 5 為單位。使用原始影像的 RGB 值以隨機方式重新創建它。
演算法嘗試:
- 測驗影像為 250x250 縮放至 1250x1250。我試圖將其分成 50 個部分(原始影像邊除以 5),然后使用 (r g b)/5 個圓圈來生成所需的顏色。例如:顏色:(100,50,5) 將在 50x50 空間中使用 20 個紅色圓圈、10 個綠色圓圈、1 個藍色圓圈,(100 50 5)/5 = 31、20 10 1 = 31。這些圓圈在 50x50 空間內的 x 和 y 坐標應該是隨機的。
我在這里的主要問題是將其放入代碼中。
代碼嘗試 1:與演算法無關,只是嘗試使用 pygame.draw.circle 列印影像(這是我制作圓圈所必需的)
import pygame
import sys
import random
image_name = sys.argv[1]
#Import Image
src_image = pygame.image.load(image_name)
(w,h) = src_image.get_size()
window = pygame.display.set_mode((w*5,h*5))
#Nested Loop To Iterate Through Rows And Columns Of Pixels
for y in range(h):
for x in range(w):
(r,g,b,_) = src_image.get_at((x,y))
print(f"{r},{g},{b},x:{x},y:{y}")
pygame.draw.circle(window,(r,g,b),(x*5,y*5),2)
pygame.display.update()
pygame.time.delay(5000)
uj5u.com熱心網友回復:
可能的解決方案,按預期作業,但由于隨機化仍然有點混亂:
通過將 r、g 和 b 值除以縮放值,在本例中為 5,我們得到每個塊中每種顏色需要繪制的圓數,該數分解為 15 的增量。(從 50 減少以允許顯示更多的影像曲線和邊緣,因為它們被隱藏了 50 個隨機區域)。進一步的亮度計算用于找到任何黑點,特別是黑色,并防止在該部分列印顏色。3 while 回圈用于分別繪制每種顏色,因為它們都繪制了不同的次數。
import pygame
import sys
import random
pygame.init()
image_name = sys.argv[1]
#Import Image
src_image = pygame.image.load(image_name)
#Get image size
(w,h) = src_image.get_size()
#Scale up and display window
window = pygame.display.set_mode((w*5,h*5))
#Nested Loop To Iterate Through Rows And Columns Of Pixels
for y in range(h):
for x in range(w):
#Get rgb values at x and y of image
(r,g,b,_) = src_image.get_at((x,y))
#chck if area is black
lum = (0.2126 * r 0.7152 * g 0.0788 * b)*255
#Calculate required number of circles
a = int(r/5)
k = int(g/5)
d = int(b/5)
#draw required number of circles
while(a > 0):
if(lum > 0.625):
pygame.draw.circle(window,(255,0,0),(random.randint((x*5)-15,(x*5)),random.randint((y*5)-15,(y*5))),1)
a-=1
while(k > 0):
if(lum > 0.625):
pygame.draw.circle(window,(0,255,0),(random.randint((x*5)-15,(x*5)),random.randint((y*5)-15,(y*5))),1)
k-=1
while(d > 0):
if(lum > 0.625):
pygame.draw.circle(window,(0,0,255),(random.randint((x*5)-15,(x*5)),random.randint((y*5)-15,(y*5))),1)
d-=1
#update screen
pygame.display.update()
#Keep window open until closed by user
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
uj5u.com熱心網友回復:
您必須先初始化 pygame,然后才能使用任何 pygame 功能:
pygame.init()
src_image = pygame.image.load(image_name)
您必須處理應用程式回圈中的事件。pygame.event.get()分別見pygame.event.pump():
對于游戲的每一幀,您都需要對事件佇列進行某種呼叫。這確保您的程式可以在內部與作業系統的其余部分進行互動。
建議使用應用程式回圈。
創建一個顏色串列并使用random.shuffle以下命令對其進行洗牌:
import pygame
import sys
import random
pygame.init()
#Import Image
image_name = sys.argv[1]
src_image = pygame.image.load(image_name)
(w,h) = src_image.get_size()
window = pygame.display.set_mode((w*5,h*5))
for y in range(h):
for x in range(w):
(r, g, b, _) = src_image.get_at((x,y))
lum = (0.2126 * r 0.7152 * g 0.0788 * b)*255
if lum > 0.625:
a, k, d = r // 5, g // 5, b // 5
colors = [(255,0,0) for _ in range(a)] [(0,255,0) for _ in range(k)] [(0,0,255) for _ in range(d)]
random.shuffle(colors)
for c in colors:
pygame.draw.circle(window,c,(random.randint((x*5)-15,(x*5)),random.randint((y*5)-15,(y*5))),1)
run = True
while run:
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
pygame.display.update()
pygame.time.delay(100)
pygame.quit()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/335896.html
上一篇:如何將陣列物件轉換為二維陣列
下一篇:如何將陣列劃分為總和最小的子陣列
