1. C++ / Говнокод #5914

    +171

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    86. 86
    87. 87
    88. 88
    bool BMPTextureLoader::Load (GraphicContent **content, string file_name)
    {
      int width, height;
      int bpp;
      unsigned char *pixels;
      ifstream file (file_name.c_str());
      char temp[4];
      long unsigned int data_shift;
    //Read BMP identifier (bfType)
      file.read(temp,2);
      temp[2] = '\0';
      if ((temp[0] != 'B') || (temp[1] != 'M'))
      {
        return false;
      }
    //Ignore file size and two reserved zero (bfSize, bfReserved1, bfReserved2)
      file.ignore(8);
    //Read pixel-data shift (bfOffBits)
      file.read(temp,4);
      data_shift = 0;
      for (int i=0; i<4; i++)
      {
        data_shift += (int)(temp[i]) * pow(256.0,i);
      }
      if (data_shift < 54)
      {
        return false;
      }
    //Ignore information data size (biSize)
      file.ignore(4);  
    //Read image width (biWidth)
      file.read(temp,4);
      width = 0;
      for (int i=0; i<4; i++)
      {
        width += (int)(temp[i]) * pow(256.0,i);
      }
      if (width < 0)
      {
        return false;
      }
    //Read image height (biHeight)
      file.read(temp,4);
      height = 0;  
      for (int i=0; i<4; i++)
      height += (int)(temp[i]) * pow(256.0,i);
      if (height < 0)
      {
        return false;
      }
    //Read mandatory 1 (biPlanes)
      file.ignore(2);
    //Read bite per pixel (biBitCount)
      file.read(temp,2);
      int bipp = 0;
      bipp += (int)(temp[0]) + (int)(temp[1])*256;
      if ((bipp <= 0) || (bipp / 8. != 3))
      {
        return false;
      }
      bpp = 3;
    //Read compression type (biCompression)
      file.read(temp,4);
      int c_type = 0;
      for (int i=0; i<4; i++)
      {
        c_type += (int)(temp[i]) * pow(256.0,i);
      }
      if (c_type != 0)
      {
        return false;
      }
      file.close();
      file.open(file_name);
      file.ignore (data_shift);
    //Read pixel data
      pixels = new unsigned char[width*height*bpp];
      for (int i=height-1; i>=0; i--)
      {
        for (int j=0; j<width; j++)
        {
          file.read(reinterpret_cast<char*>(&pixels[i*width*bpp + j*bpp + 2]), 1);
          file.read(reinterpret_cast<char*>(&pixels[i*width*bpp + j*bpp + 1]), 1);
          file.read(reinterpret_cast<char*>(&pixels[i*width*bpp + j*bpp]), 1);
        }
      }
    //Create texture
      Terminal terminal;

    Считываю BMP файл. Размеры, количество бит на пиксель и тип сжатия считываются нормально. Бит на пиксель 24, сжатия нет(0). Дальше я переоткрываю файл и отступаю нужное кол-во пикселей (смещение данных). После этого считываю данные о цветах пикселей. С рисунками нарисованными непосредственно мной всё проходит нормально. Но с картинками взятыми из интернета происходит сбой. После определённого пикселя считывание прекращается. По дебагу получается что при достижение этого пикселя наступает конец файла. Пробовал вырезать куски изображения из нета и переносить в свой файл. Одни куски переносятся и всё нормально, другие обрывают считывание. Наблюдал эту проблему у нескольких рисунков. Возможно кто-то сталкивался с такой проблемой?

    Источник: http://www.gamedev.ru/code/forum/?id=144831

    Запостил: TarasB, 07 Марта 2011

    Комментарии (19) RSS

    • Файл читается в текстовом режиме
      pow(256.0,i)

      file.read(reinterpret_cast<char*>(&pixel s[i*width*bpp + j*bpp + 2]), 1);
      file.read(reinterpret_cast<char*>(&pixel s[i*width*bpp + j*bpp + 1]), 1);
      file.read(reinterpret_cast<char*>(&pixel s[i*width*bpp + j*bpp]), 1);

      Жесть :)
      Ответить
    • посмотрите на тему открытие файла. нужно открывать не как текстовый.
      ну и int32 читать как 1 int32, а не как 4 int8
      Ответить
      • > ну и int32 читать как 1 int32, а не как 4 int8

        А вот так делать не стоит.
        Ответить
        • это на случай обратной записи dword'ов?
          Ответить
          • Это на случай другого размера и порядка байт.
            Ответить
        • Тогда уж считать сначала как int32, а потом стандартную функцию вызвать для преобразования из порядка, принятого в файле, в порядок, принятый на машине.
          Ответить
          • Только если char -- октеты и если в файле используется сетевой порядок байт (что, очевидно, не так).
            Ответить
            • Дык не из сетевого в машинный, а из файлового в машинный.
              Ответить
      • Ему на форуме уже ответили.
        Ответить
    • > bite per pixel
      Ответить
      • надкусанный пиксель ... из таких нарисован один известный логотип
        Ответить
      • байт по-украински
        Ответить
        • когда техас отделится они так будут самостийно писать
          Ответить
    • vanished
      Ответить

    Добавить комментарий