c - 处理图像时,它在 GTK 中得到奇怪的颜色

标签 c image-processing gtk rgb

大家好,来自 stackoverflow 的人,我想做的是通过逐像素变换来处理图像,使其变暗。这个想法真的很简单,我必须做这样的事情:

R *= factor
G *= factor 
B *= factor

其中“factor”是一个介于 0 和 1 之间的 float ,R、G、B 是每个像素的 Rgb 数。为此,我加载了一个“RGB”文件,每个像素具有从 0 到 255 的三个数字到一个字符指针数组。

char *imagen1, *imagen; 
int resx, resy;      //resolution

imagen1 = malloc....;
//here I load a normal image buffer to imagen1

float factor = 0.5f; // it can be any number between 0 an 1

for(unsigned int i=0; i< 3*resx*resy; i++)
  imagen[i] = (char) (((int) imagen1[i])*factor);

gtk_init (&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
pixbuf = gdk_pixbuf_new_from_data (buffer, GDK_COLORSPACE_RGB, FALSE, 8,
                                   resx, resy, (resx)*3, NULL, NULL);
image = gtk_image_new_from_pixbuf (pixbuf);
gtk_container_add(GTK_CONTAINER (window), image);

pixbuf = gdk_pixbuf_new_from_data (imagen, GDK_COLORSPACE_RGB, FALSE, 8,
resx, resy, (resx)*3, NULL, NULL);
gtk_image_set_from_pixbuf(image, pixbuf);

如果GTK部分没写好就忽略,显示“imagen”。如果 factor 为 1,则图像显示良好,颜色真实。问题是当我使用 0 到 1 之间的数字时,显示的图像会变得非常奇怪,就像它“饱和”或颜色深度更差一样。因子越远,图像越差。我不知道为什么会这样,我认为 GTK 标准化了 RGB 值,因此颜色深度减少了,但我尝试添加一些白色 (255, 255, 255) 和黑色 (0, 0, 0) 像素和问题仍然存在。我想知道我做错了什么,对不起我的英语。提前致谢!

最佳答案

像素的颜色分量是转换为 int 的 8 位字符。然后乘以 float ,因此 int 首先转换为 float ,结果是 float 。然后将此 float 向下转换为一个 char,它脱离了 float 的表示形式,看起来与您真正希望它看起来像的 int 完全不同。

在转换回 char 之前,您需要将此结果转换为 int。

关于c - 处理图像时,它在 GTK 中得到奇怪的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49844254/

相关文章:

使用 kill 函数创建僵尸进程

c - 如何从指针读取 64 位到 8 位值

python - PyGi : How to use a GTKListBox with a GTKListStore?

c - 通过使用指针传递函数来修改函数内的全局变量是一个好习惯吗?

将short 钳位为无符号字符

python - 如何从表单的扫描图像中提取数据?

actionscript-3 - 使用 AS3 检查 PNG 图像是否包含(半)透明像素

image - 使用 SkiaSharp 调整大小时 iPhone 图像方向错误

c++ - 不使用设置颜色的开罗渐变图案

c++ - 使用 Gdb 调试器,我应该如何继续找出 "Program terminated with signal 11, Segmentation fault."的原因