Difference between revisions of "Targa.c"
From Organic Design wiki
m |
m |
||
(27 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
+ | {{legacy}} | ||
+ | <source lang="c"> | ||
// Licenced under LGPL: www.gnu.org/copyleft/lesser.html | // Licenced under LGPL: www.gnu.org/copyleft/lesser.html | ||
#include <stdlib.h> | #include <stdlib.h> | ||
Line 7: | Line 9: | ||
// Create a new targa image in memory | // Create a new targa image in memory | ||
char* newImage(int width, int height) { | char* newImage(int width, int height) { | ||
− | char* image = | + | char* image = malloc(18+4*width*height+26); |
+ | strcpy(image+18+4*width*height+8,"TRUEVISION-XFILE."); | ||
+ | image[2] = 2; | ||
image[12] = width & 0xff; | image[12] = width & 0xff; | ||
image[13] = (width & 0xff00) >> 8; | image[13] = (width & 0xff00) >> 8; | ||
− | image[14] = | + | image[14] = height & 0xff; |
image[15] = (height & 0xff00) >> 8; | image[15] = (height & 0xff00) >> 8; | ||
image[16] = ' '; | image[16] = ' '; | ||
image[17] = 8; | image[17] = 8; | ||
− | |||
return image; | return image; | ||
} | } | ||
− | int getSize(char* image) { | + | // Return complete byte size of passed image |
+ | int getSize(unsigned char* image) { | ||
int width = (image[13]<<8)+image[12]; | int width = (image[13]<<8)+image[12]; | ||
int height = (image[15]<<8)+image[14]; | int height = (image[15]<<8)+image[14]; | ||
− | + | return 18+4*width*height+26; | |
− | return 18+4*width*height; | ||
} | } | ||
− | char* getOffset(char* image, int x, int y) { | + | // Return address of pixel x,y in passed image |
+ | char* getOffset(unsigned char* image, int x, int y) { | ||
int width = (image[13]<<8)+image[12]; | int width = (image[13]<<8)+image[12]; | ||
return image+18+4*(x+y*width); | return image+18+4*(x+y*width); | ||
} | } | ||
+ | // Return the content of pixel x,y for the passed image | ||
int getPixel(char* image, int x, int y) { | int getPixel(char* image, int x, int y) { | ||
return *getOffset(image,x,y); | return *getOffset(image,x,y); | ||
} | } | ||
+ | // Set pixel x,y to passed colour allowing for alpha | ||
void setPixel(char* image, int x, int y, int colour) { | void setPixel(char* image, int x, int y, int colour) { | ||
int i, col[3], a = colour >> 24; | int i, col[3], a = colour >> 24; | ||
Line 39: | Line 45: | ||
col[1] = (colour & 0xff00) >> 8; | col[1] = (colour & 0xff00) >> 8; | ||
col[2] = colour & 0xff; | col[2] = colour & 0xff; | ||
− | char* pix = getOffset(image,x,y); | + | unsigned char* pix = getOffset(image,x,y); |
− | for (i= | + | for (i = 0; i < 3; i++) |
− | pix[i] = ( | + | pix[i] = (a*col[i]+(255-a)*pix[i])/255; |
} | } | ||
+ | // Fill a rect in passed image using passed bounds and colour | ||
void fillRect(char* image, int x1, int y1, int x2, int y2, int colour) { | void fillRect(char* image, int x1, int y1, int x2, int y2, int colour) { | ||
int x,y; | int x,y; | ||
− | for (y=y1; y<y2; y++) | + | for (y = y1; y < y2; y++) |
− | for (x=x1; x<x2; x++) | + | for (x = x1; x < x2; x++) |
setPixel(image,x,y,colour); | setPixel(image,x,y,colour); | ||
} | } | ||
− | // Create test image | + | // Create test a image |
− | char* image = newImage( | + | char* image = newImage(200,200); |
− | + | fillRect(image,50,50,100,100,0xff0000ff); | |
− | + | fillRect(image,75,75,175,175,0x80ff0000); | |
+ | fillRect(image,60,60,165,165,0x40ff00ff); | ||
+ | |||
+ | // Write test image to file and convert to jpeg | ||
int fd = creat("/var/www/wiki/targa.tga",0x755); | int fd = creat("/var/www/wiki/targa.tga",0x755); | ||
write(fd,image,getSize(image)); | write(fd,image,getSize(image)); | ||
+ | system("cjpeg -quality 100 /var/www/wiki/targa.tga > /var/www/wiki/targa.jpg"); | ||
} | } | ||
+ | </source> | ||
+ | [[Category:C]] |
Latest revision as of 15:26, 6 July 2015
// Licenced under LGPL: www.gnu.org/copyleft/lesser.html
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
main() {
// Create a new targa image in memory
char* newImage(int width, int height) {
char* image = malloc(18+4*width*height+26);
strcpy(image+18+4*width*height+8,"TRUEVISION-XFILE.");
image[2] = 2;
image[12] = width & 0xff;
image[13] = (width & 0xff00) >> 8;
image[14] = height & 0xff;
image[15] = (height & 0xff00) >> 8;
image[16] = ' ';
image[17] = 8;
return image;
}
// Return complete byte size of passed image
int getSize(unsigned char* image) {
int width = (image[13]<<8)+image[12];
int height = (image[15]<<8)+image[14];
return 18+4*width*height+26;
}
// Return address of pixel x,y in passed image
char* getOffset(unsigned char* image, int x, int y) {
int width = (image[13]<<8)+image[12];
return image+18+4*(x+y*width);
}
// Return the content of pixel x,y for the passed image
int getPixel(char* image, int x, int y) {
return *getOffset(image,x,y);
}
// Set pixel x,y to passed colour allowing for alpha
void setPixel(char* image, int x, int y, int colour) {
int i, col[3], a = colour >> 24;
col[0] = (colour & 0xff0000) >> 16;
col[1] = (colour & 0xff00) >> 8;
col[2] = colour & 0xff;
unsigned char* pix = getOffset(image,x,y);
for (i = 0; i < 3; i++)
pix[i] = (a*col[i]+(255-a)*pix[i])/255;
}
// Fill a rect in passed image using passed bounds and colour
void fillRect(char* image, int x1, int y1, int x2, int y2, int colour) {
int x,y;
for (y = y1; y < y2; y++)
for (x = x1; x < x2; x++)
setPixel(image,x,y,colour);
}
// Create test a image
char* image = newImage(200,200);
fillRect(image,50,50,100,100,0xff0000ff);
fillRect(image,75,75,175,175,0x80ff0000);
fillRect(image,60,60,165,165,0x40ff00ff);
// Write test image to file and convert to jpeg
int fd = creat("/var/www/wiki/targa.tga",0x755);
write(fd,image,getSize(image));
system("cjpeg -quality 100 /var/www/wiki/targa.tga > /var/www/wiki/targa.jpg");
}