На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Обязательно указание:
1) типа базы данных (Paradox/Oracle/Interbase и т.п.)
2) способа доступа к базе данных (ODBC/ADO/DAO/BDE и т.п.)
Например: Paradox/BDE, MS Access/ADO

Наиболее часто задаваемые вопросы:
Базы даных для начинающих. Первые шаги. Понятие о BDE.
Переход на клиент-сервер и начала ADO
Приёмы работы с BLOB (OLE/Memo) полями
Запросы и параметры или как избавиться от многих проблем. Проблемы с датами в запросах.
Нужели мне нужно устанавливать BDE? (или почему не работает программа на другом компьютере)
Модераторы: Bas, Rouse_
  
> Загрузка изображения из БД "Bitmap is not valid"
    есть таблица и в ней есть 3 поля типа "Поле объекта ОЛЕ"
    в этих полях я буду хранить изображения разного размера

    так вот изображения я помещать прямо в аксесе через CTRL+V
    при этом если я вставляю jpg, то в записи появляется слово "Плакат"
    если вставляю bmp, то в записи появляется "Точечный ричунок"

    и теперь хочу отобразить картинку через DBImage
    выставляю нужный датасорс и выставляю поле картинки (DataField)

    запускаю и выкатывается ошибка "Bitmap is not valid"

    на строчке
    ExpandedWrap disabled
      procedure InvalidGraphic(Str: PResStringRec);
      begin
        raise EInvalidGraphic.CreateRes(Str);
      end;

    модуля Graphics

    что разве DBImage не поддерживает отображение картинок форматов jpg и bmp?
    Или что?
      а не пробывала считывать через поток картинку из БД?
        Оля! Не поленись полазить в ПОИСКЕ - работа с BLOB-полями :yes: И не только в Дельфях, но и в Билдере.
          если успользовать DBCtrlGrid с вкладки DataControls (он мне нужен для отображения по 5 записей из таблицы БД)

          значение ColCount = 1,значение RowCount = 5
          на первой гладкой ячейки этого компонента есть DBLabel, DBMemo и обычный Image

          и при отображении изображений из поля они во всех Имейджах одинаковые :( - ведь это на DB_компонент
          ExpandedWrap disabled
             function GetStreamImgType(Stream: TStream): TGraphicClass;
            var
              StreamPos: int64;
              ImgSign: string;
            begin
              StreamPos := Stream.Position;
              try
                //BMP
                Result := Graphics.TBitmap;
             
                //JPEG
                SetLength(ImgSign, 4);
                Stream.Seek(6, soFromCurrent);
                Stream.Read(ImgSign[1],4);
                if (UpperCase(ImgSign) = 'JFIF') or (UpperCase(ImgSign) = 'EXIF') then
                begin
                  Result := Jpeg.TJPEGImage;
                  Exit;
                end;
             
                //WMF
                Stream.Position := StreamPos;
                SetLength(ImgSign, 4);
                Stream.Read(ImgSign[1],4);
                if ImgSign = #$D7#$CD#$C6#$9A then //see WMFKey
                begin
                  Result := Graphics.TMetafile;
                  Exit;
                end;
             
                //PNG
                Stream.Position := StreamPos;
                SetLength(ImgSign, 3);
                Stream.Seek(1, soFromCurrent);
                Stream.Read(ImgSign[1],3);
                if (UpperCase(ImgSign) = 'PNG') then
                begin
                  Result := PNGImage.TPNGImage;
                  Exit;
                end;
             
              finally
                Stream.Position := StreamPos;
              end;
            end;
             
            ///
            procedure LoadProperImage(Stream: TStream; Picture: TPicture);
            var
              Img: TGraphic;
              StreamPos: int64;
            begin
              StreamPos := Stream.Position;
              Img := GetStreamImgType(Stream).Create;
              try
                Stream.Position := StreamPos;
                Img.LoadFromStream(Stream);
             
                Wid := img.Width;
                hei := img.Height;
             
                Picture.Graphic := Img;
              finally
                Img.Free;
              end;
            end;
             
            function LoadPictureFromBLOB(Picture: TPicture; Field: TBlobField): boolean;
            var
              Stream: TStream;
            begin
              Result := False;
              if not Field.isNULL then
              begin
                Stream := TMemoryStream.Create;
                try
                  Field.SaveToStream(Stream);
                  Stream.Position := 0;
                  LoadProperImage(Stream, Picture);
                  Result := True;
                  finally
                  Stream.Free;
                end;
              end;
            end;


          и
          ExpandedWrap disabled
            procedure TForm1.FormCreate(Sender: TObject);
            begin
              Image1.Picture.Bitmap.FreeImage;
              LoadPictureFromBLOB(image1.Picture, AdoTable1.FieldByName('SMALL_IMAGE') as TBLOBField);
            end;


          получается что во всех имейджах одинаковые картинки

          как быть тогда
          Прикреплённый файлПрикреплённый файл555.JPG (106.15 Кбайт, скачиваний: 648)
            а если кинуть компонент DBImage и выставить нужное поле, то в дизайн-тайме сразу отображается картинка
            Я обрадовалась но не тут-то было
            При компиляции приложения выскакивает опять "Bitmap is not valid"

            этот компонент недоделанный что-ли :blink:
            или я не то делаю ?
            Прикреплённый файлПрикреплённый файл666.JPG (36.01 Кбайт, скачиваний: 662)
              Оля, посмотри в Королевстве Дельфи, было довольно много обсуждений ошибки "Bitmap image is not valid". В частности - здесь:
              http://www.delphikingdom.com/asp/answer.asp?IDAnswer=15873
              (ну, и по первой ссылке оттуда тоже сходи...)
                olga90
                а ты куда прикрутила свой код вот этот
                ExpandedWrap disabled
                    Image1.Picture.Bitmap.FreeImage;
                    LoadPictureFromBLOB(image1.Picture, AdoTable1.FieldByName('SMALL_IMAGE') as TBLOBField);

                на какое событие?
                  Цитата dron-s @
                  olga90
                  а ты куда прикрутила свой код вот этот
                  ExpandedWrap disabled
                      Image1.Picture.Bitmap.FreeImage;
                      LoadPictureFromBLOB(image1.Picture, AdoTable1.FieldByName('SMALL_IMAGE') as TBLOBField);


                  я уже писала - на onCreate формы
                    Цитата olga90 @
                    я уже писала - на onCreate формы

                    ну и что ты тогда хочешь от этого кода?
                    у тебя получается что картинка загружается из той позиции, на которой у тебя находится курсор...
                    а после перемещения на следующую позиции у тебя не происходит перезагрузки изображения...
                    это не DBImage которая загружает картинку из той позиции на которой находится курсор... тут надо всё ручками делать :)
                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0,1073 ]   [ 16 queries used ]   [ Generated: 27.09.24, 01:12 GMT ]