Blend.c 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. /*
  2. * The Python Imaging Library
  3. * $Id$
  4. *
  5. * interpolate between two existing images
  6. *
  7. * history:
  8. * 96-03-20 fl Created
  9. * 96-05-18 fl Simplified blend expression
  10. * 96-10-05 fl Fixed expression bug, special case for interpolation
  11. *
  12. * Copyright (c) Fredrik Lundh 1996.
  13. * Copyright (c) Secret Labs AB 1997.
  14. *
  15. * See the README file for details on usage and redistribution.
  16. */
  17. #include "Imaging.h"
  18. Imaging
  19. ImagingBlend(Imaging imIn1, Imaging imIn2, float alpha) {
  20. Imaging imOut;
  21. int x, y;
  22. /* Check arguments */
  23. if (!imIn1 || !imIn2 || imIn1->type != IMAGING_TYPE_UINT8 || imIn1->palette ||
  24. strcmp(imIn1->mode, "1") == 0 || imIn2->palette ||
  25. strcmp(imIn2->mode, "1") == 0) {
  26. return ImagingError_ModeError();
  27. }
  28. if (imIn1->type != imIn2->type || imIn1->bands != imIn2->bands ||
  29. imIn1->xsize != imIn2->xsize || imIn1->ysize != imIn2->ysize) {
  30. return ImagingError_Mismatch();
  31. }
  32. /* Shortcuts */
  33. if (alpha == 0.0) {
  34. return ImagingCopy(imIn1);
  35. } else if (alpha == 1.0) {
  36. return ImagingCopy(imIn2);
  37. }
  38. imOut = ImagingNewDirty(imIn1->mode, imIn1->xsize, imIn1->ysize);
  39. if (!imOut) {
  40. return NULL;
  41. }
  42. if (alpha >= 0 && alpha <= 1.0) {
  43. /* Interpolate between bands */
  44. for (y = 0; y < imIn1->ysize; y++) {
  45. UINT8 *in1 = (UINT8 *)imIn1->image[y];
  46. UINT8 *in2 = (UINT8 *)imIn2->image[y];
  47. UINT8 *out = (UINT8 *)imOut->image[y];
  48. for (x = 0; x < imIn1->linesize; x++) {
  49. out[x] = (UINT8)((int)in1[x] + alpha * ((int)in2[x] - (int)in1[x]));
  50. }
  51. }
  52. } else {
  53. /* Extrapolation; must make sure to clip resulting values */
  54. for (y = 0; y < imIn1->ysize; y++) {
  55. UINT8 *in1 = (UINT8 *)imIn1->image[y];
  56. UINT8 *in2 = (UINT8 *)imIn2->image[y];
  57. UINT8 *out = (UINT8 *)imOut->image[y];
  58. for (x = 0; x < imIn1->linesize; x++) {
  59. float temp = (float)((int)in1[x] + alpha * ((int)in2[x] - (int)in1[x]));
  60. if (temp <= 0.0) {
  61. out[x] = 0;
  62. } else if (temp >= 255.0) {
  63. out[x] = 255;
  64. } else {
  65. out[x] = (UINT8)temp;
  66. }
  67. }
  68. }
  69. }
  70. return imOut;
  71. }