Я пытаюсь преобразовать изображение в матрицу его значений rbg в С++, мне очень нравится простота PIL при обработке различных расширений изображений, поэтому в настоящее время у меня есть два кода
from PIL import Image
img=Image.open("oi.png")
pixel=img.load()
width,height=img.size
print(height)
print(width)
def rgb(r, g, b):
return ((r & 0xff) << 16) + ((g & 0xff) << 8) + (b & 0xff)
for x in range(width):
for y in range(height):
print(rgb(pixel[x,y][0],pixel[x,y][1],pixel[x,y][2]))
и получить на C++
#include <bits/stdc++.h>
using namespace std;
#define __ ios_base::sync_with_stdio(false);cin.tie(NULL);
int main(){__
long long height,width;cin>>height>>width;
unsigned long img[width][height];
for(long long j=0; j<height;j++) for (long long i=0; i<width;i++){
cin>>img[i][j];
}
return 0;}
и я подключаю оба терминала кpython3 code.py | ./code
это работает для очень маленьких изображений, но для больших возвращается BrokenPipeError: [Errno 32] Broken pipe
Что я должен делать? есть ли лучший способ достичь того, чего я пытаюсь достичь?
Я хочу подключить вывод Python к входу С++ даже с большими выходами без ошибки сломанного канала.
Если width
и height
являются long long
, то почему i
и j
int
?
@JosephSible-ReinstateMonica изменила это! я пытаюсь работать с изображениями 1000x1000
Примечания: (1) Почему мне не следует #include <bits/stdc++.h>? (2) В чем проблема с «использованием пространства имен std;»? .
unsigned long img[width][height];
— недействителен стандарт C++. См.: Почему массивы переменной длины не являются частью стандарта C++?.
«Разбитый канал» означает, что программа попыталась выполнить запись в канал, из которого больше не было программ, читающих данные. Это означает, что ваша программа C++ завершается раньше, чем должна.
Для изображения размером 1000x1000, если вы используете его на Linux x86_64, img
составляет 8 МБ. Я подозреваю, что он слишком велик для стека, что приводит к сбою вашей программы на C++. Вы можете это исправить, выделив img
в куче.
Каковы размеры изображения, на котором он не работает?