I need to learn this stuff in order to pass the exams so I tried this code but it didn’t work. How can I get it to work?
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <math.h>
#include "img_header.h"
('img_header.h' contains some functions)
void simple_rgb_image_init(Simple_RGB_Image* sink, int32_t width, int32_t height);
typedef struct {
int32_t width;
int32_t height;
uint8_t* data;
} Simple_RGB_Image;
int main()
{
Simple_RGB_Image img;
int32_t width = 3;
int32_t height = 3;
FILE* out_file;
int32_t w;
int32_t x,y ;
uint8_t red,green,blue;
uint8_t* p_red;
uint8_t* p_green;
uint8_t* p_blue;
p_red = &red;
p_green = &green;
p_blue = &blue;
simple_rgb_image_init(&img,width,height);
x = 1 ;
y = 1 ;
w = calculate_stride(width); //calculate the stride
blue = img.data[3 *(w*y + x) + 0];
green = img.data[3 *(w*y + x) + 1];
red = img.data[3 *(w*y + x) + 3];
printf("blue = %i \n" , blue); //205
printf("green = %i \n" , green);//205
printf("red = %i \n" , red); //205
printf("\n\n");
*p_red = 0;
*p_green = 0;
*p_blue = 255;
printf("blue = %i \n" , blue); //255
printf("green = %i \n" , green);//0
printf("red = %i \n" , red); //0
out_file = fopen("My_picture.bmp","wb");
simple_rgb_image_to_bitmap_stream(&img,out_file); //save the picture as a Bitmap file
fclose(out_file);
simple_rgb_image_clear(&img); //Free memory
return 0;
}
void simple_rgb_image_init(Simple_RGB_Image* sink, int32_t width, int32_t height)
{
sink->width = width;
sink->height = height;
sink->data = (uint8_t*)malloc(3 * width * height);
}
I did dealt directly with pointers , but in vain ! The code is still generating a 9 Pixels Bitmap-image ,with the color (Red = 205 , Blue = 205 , Green = 205) and that seems a strange result cause when I compile the code , it prints out this:
blue = 0
green = 72
red = 45
blue = 255
green = 0
red = 0
Press any key to continue . . .
and the code is :
p_blue = &(img.data[3 *(w*y + x) + 0]);
p_green = &(img.data[3 *(w*y + x) + 1]);
p_red = &(img.data[3 *(w*y + x) + 2]);
printf("blue = %i \n" , *p_blue);
printf("green = %i \n" , *p_green);
printf("red = %i \n" , *p_red);
printf("\n\n");
*p_red = 0;
*p_green = 0;
*p_blue = 255;
printf("blue = %i \n" , *p_blue);
printf("green = %i \n" , *p_green);
printf("red = %i \n" , *p_red);
The problem here is, you're making changes to the local variable
red
,green
,blue
. The chages are not reflected insideimg
.Instead, get rid of these local variables and directly deal with the pointers, like
and then, if you do
it will be reflected in
img
.That said, please do not cast the return value of
malloc()
and family inC
.