Vayn,
Geekoaur ответил на ваш вопрос хорошо, я просто указываю еще одну «проблему» с вашим кодом.
Строка s1 [strlen (s1)] = '\ 0';
является no-op , если s1
уже полностью нулевое завершение до того, как оно выполняется.
Но если s1
NOT allready должным образом завершен нулем до того, как эта строка выполняется (и вам не повезло), это приведет к:
Это потому, что strlen
basicaly находит индекс существующего нуль-терминатора и возвращает его! Вот действительная, неоптимизированная реализация strlen:
int strlen (char * string) {int i = 0; while (string [i]! = '\ 0') {++ i; } return i; }
Итак ... Если вы ДЕЙСТВИТЕЛЬНО беспокоитесь о том, что строки НЕ были завершены нулями, вы сделали бы что-то вроде:
string [sizeof (string)] = '\ 0';
на локальных автоматических строках (где компилятор «знает» размер строки); [SIZE_OF_STRING]
для всех остальных строк, где SIZE_OF_STRING
(чаще всего) a #define
'd константа или переменная, которую вы поддерживаете специально для хранения текущего SIZE (не длина) динамически выделенной строки. И если вы ДЕЙСТВИТЕЛЬНО, ДЕЙСТВИТЕЛЬНО, ДЕЙСТВИТЕЛЬНО беспокоитесь о строках, (например, вы используете «грязные» методы libary (например, ATMI Tuxedo), вы также «очищаете» свои «строки возврата» перед передачей их методам подозрительной библиотеки с помощью:
memset (string, NULL, SIZE_OF_STRING);
DirtyFunction (/ * out * / string)
; string [SIZE_OF_STRING] = '\ 0' [! d15]
SIG11 - это полная привязка для поиска, потому что (если вы не «зацепите» их с помощью signal-processor и сказать иначе, они заставляют unix жестко завершать вашу программу, поэтому вы не можете ничего записывать (после факта), чтобы помочь выяснить, here-in-the-hell-do-that-come-from ... особенно учитывая, что во многих случаях строка кода, которая выбрасывает SIG11, не находится рядом с фактической причиной того, что строка теряет нулевой ограничитель.
Разве это имеет для вас смысл?
Cheers mate. Keith.
PS: ПРЕДУПРЕЖДЕНИЕ: strncpy
НЕ все пустил нуль ... вы, вероятно, имели в виду strlcpy
. Я узнал об этом трудным образом ... когда сработал биллинг на 60 миллионов долларов.
EDIT:
FYI: Вот «безопасная» (неоптимизированная) версия strlen который я назову strnlen
(я считаю, что это должно быть в stdlib . Sigh.).
// перенастраивает длину string (capped at size-1) int strnlen (char * string, int size) {int i = 0; while (i & lt; size & amp; & amp; string [i]! = '\ 0') {++ i; } return i; }
Сначала вы должны нарисовать изображение. Вы можете сделать это, создав виджет QLabel
и позвонив setPixmap
. Прежде чем делать это, вам нужно преобразовать QImage
в QPixmap
(вы можете использовать QPixmap.fromImage(img)
).
Вы можете получить щелчки мыши, выполнив подкласс QImage
и перехватив mousePressEvent
. Посмотрите значение пикселя с помощью QImage.pixel()
.
self.image = QLabel()
self.image.setPixmap(QPixmap("C:\\myImg.jpg"))
self.image.setObjectName("image")
self.image.mousePressEvent = self.getPos
def getPos(self , event):
x = event.pos().x()
y = event.pos().y()
Этот вопрос старый, но для всех, кто здесь, как и я, это мое решение, основанное на ответе Джареда:
self.img = QImage('fname.png')
pixmap = QPixmap(QPixmap.fromImage(self.img))
img_label = QLabel()
img_label.setPixmap(pixmap)
img_label.mousePressEvent = self.getPixel
def self.getPixel(self, event):
x = event.pos().x()
y = event.pos().y()
c = self.img.pixel(x,y) # color code (integer): 3235912
# depending on what kind of value you like (arbitary examples)
c_qobj = QColor(c) # color object
c_rgb = QColor(c).getRgb() # 8bit RGBA: (255, 23, 0, 255)
c_rgbf = QColor(c).getRgbf() # RGBA float: (1.0, 0.3123, 0.0, 1.0)
return x, y, c_rgb
Убедитесь, что размер метки соответствует размеру изображения, иначе координаты мыши x и y должны быть преобразованы в координаты изображения. И я думаю, что также возможно использовать метод .pixel()
непосредственно на pixmap, но объект QImage, похоже, работает лучше в моем случае.