LINUX.ORG.RU

[GTK#] [Gdk.Pixbuf] foreach pixel


0

1

Есть вот такой код:

unsafe{
	var width=workImage.Width;
	var height=workImage.Height;
	
        for(int y=0;y<height;y++)
		for(int x=0;x<width;x++){
			byte*p=((byte*)workImage.Pixels)+height*y+x;
			*p=0;
		}

переменная workImage имеет тип Gdk.Pixbuf. По идее, как только мы в объект image1 класса Gtk.Image передадим объект workImage:

 Gtk.Image image1;
 ...
 image1.Pixbuf=workImage

то должно быть отрисовано черное изображение, но на деле оно черное лишь процентов на 25. Может кто подскажет, где я ошибся?


А какой формат этого конкретного pixbufа? Я так думаю, что RGBA32, и вы заполняете лишь четверть пикселей.

dmitry_vk ★★★
()

и еще одно, кроме 32-х бит на пиксель.

обход у тебя какой-то странный. по-идее, должно быть width*y, а не height*y. и в этом случае, лучше использовать не workImage.Width, а workImage.Rowstride

ananas ★★★★★
()
Ответ на: комментарий от Pantserovik

Залить можно и простым способом. Мне нужно это для других целей. А *p=0; взято для простоты изложения.

lsv
() автор топика

А еще такой вопрос:

почему, если workImage повернуть на 90 градусов:

workImage=workImage.RotateSimple(PixbufRotation.Clockwise);

То это обращение:

int color=*(((int*)pb.Pixels)+height*y+x;

вылетает в ошибкой с x=445 и y=449. Размер workImage до поворота 800x600, после, как и водится, 600x800.

lsv
() автор топика
Ответ на: комментарий от lsv

Разве?

Да. Плюс тут ещё упоминали про rowstride, поэтому должно быть что-то типа:

byte*p = ((byte*)workImage.Pixels)+workImage.Rowstride*y+x;

Ну и про формат пикселей не забудь.

runtime ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.