skins.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. var logging = require("./logging");
  2. var lwip = require("lwip");
  3. var fs = require("fs");
  4. var config = require("./config");
  5. var exp = {};
  6. // extracts the face from an image +buffer+
  7. // result is saved to a file called +outname+
  8. // +callback+ contains error
  9. exp.extract_face = function(buffer, outname, callback) {
  10. lwip.open(buffer, "png", function(err, image) {
  11. if (err) {
  12. callback(err);
  13. } else {
  14. image.batch()
  15. .crop(8, 8, 15, 15) // face
  16. .writeFile(outname, function(err) {
  17. if (err) {
  18. callback(err);
  19. } else {
  20. callback(null);
  21. }
  22. });
  23. }
  24. });
  25. };
  26. // extracts the helm from an image +buffer+ and lays it over a +facefile+
  27. // +facefile+ is the filename of an image produced by extract_face
  28. // result is saved to a file called +outname+
  29. // +callback+ contains error
  30. exp.extract_helm = function(facefile, buffer, outname, callback) {
  31. lwip.open(buffer, "png", function(err, skin_img) {
  32. if (err) {
  33. callback(err);
  34. } else {
  35. lwip.open(facefile, function(err, face_img) {
  36. if (err) {
  37. callback(err);
  38. } else {
  39. face_img.toBuffer("png", {compression: "none"}, function(err, face_buffer) {
  40. skin_img.crop(40, 8, 47, 15, function(err, helm_img) {
  41. if (err) {
  42. callback(err);
  43. } else {
  44. face_img.paste(0, 0, helm_img, function(err, face_helm_img) {
  45. if (err) {
  46. callback(err);
  47. } else {
  48. face_helm_img.toBuffer("png", {compression: "none"}, function(err, face_helm_buffer) {
  49. if (face_helm_buffer.toString() !== face_buffer.toString()) {
  50. face_helm_img.writeFile(outname, function(err) {
  51. callback(err);
  52. });
  53. } else {
  54. logging.log("Helm image is the same as face image, not storing!");
  55. callback(null);
  56. }
  57. });
  58. }
  59. });
  60. }
  61. });
  62. });
  63. }
  64. });
  65. }
  66. });
  67. };
  68. // resizes the image file +inname+ to +size+ by +size+ pixels
  69. // +callback+ contains error, image buffer
  70. exp.resize_img = function(inname, size, callback) {
  71. lwip.open(inname, function(err, image) {
  72. if (err) {
  73. callback(err, null);
  74. } else {
  75. image.batch()
  76. .resize(size, size, "nearest-neighbor") // nearest-neighbor doesn't blur
  77. .toBuffer("png", function(err, buffer) {
  78. callback(null, buffer);
  79. });
  80. }
  81. });
  82. };
  83. // returns "alex" or "steve" calculated by the +uuid+
  84. exp.default_skin = function(uuid) {
  85. if (Number("0x" + uuid[31]) % 2 === 0) {
  86. return "alex";
  87. } else {
  88. return "steve";
  89. }
  90. };
  91. exp.open_skin = function(hash, callback) {
  92. fs.readFile(__dirname + "/../" + config.skins_dir + hash + ".png", function (err, buf) {
  93. if (err) {
  94. logging.error("error while opening skin file: " + err);
  95. }
  96. callback(err, buf);
  97. });
  98. };
  99. module.exports = exp;