powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вопросы по работе с bimap/graphics -многостраничный TIFF, отображение, сохранение итд
1 сообщений из 1, страница 1 из 1
Вопросы по работе с bimap/graphics -многостраничный TIFF, отображение, сохранение итд
    #38896546
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В VB6 я использовал класс CMultiFrameImage, любезно предоставленный когда-то Бенедиктом.
8283653
Много чего сам доделывал под себя.
Вкратце, это GDI+, работа с многостраничными документами (коими являются TIFF), позволяет масштабировать картинку, сохранять в файл в различных форматах, с преобразованиями цвета (напр. цв-> чб), разрешения и т.п.

Тащить API-шное GDI+ в .Net не вижу смыла ибо в .Net есть объекты Bitmap/Graphics т.е. по сути полноценная обертка GDI+.

Начал писать класс.
Первая задача - масштабирование, т.е. надо вписать картинку в PictureBox по ширине PictureBox, расположить сверху и не растягивать вниз.

Накатал пока (лишнее опустил):

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
Public Class Form1
  Dim m_mfi As New cMultiFrameImage

  Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
    m_mfi.LoadFromFile("c:\111\test.tif")
  End Sub

  Private Sub ButtonShow_Click(sender As Object, e As EventArgs) Handles ButtonShow.Click
    PictureBox1.Image = m_mfi.Zoom(, PictureBox1.Width, 0)
  End Sub
...


Public Class cMultiFrameImage
  Private m_Bitmap As Bitmap
  Private m_nFrameCount As Integer
  Private m_nFrameIndex As Integer

  Public Sub LoadFromFile(ByVal FileName As String)
    Clear()
    m_nFrameCount = 0
    m_nFrameIndex = 0
    If IO.File.Exists(FileName) = False Then Exit Sub
    Try : m_Bitmap = New Bitmap(FileName) : Catch : End Try
  End Sub

  Public ReadOnly Property FrameCount() As Integer
    Get
      If m_nFrameCount = 0 Then
        If Not m_Bitmap Is Nothing Then
          Try : m_nFrameCount = m_Bitmap.GetFrameCount(FrameDimension.Page) : Catch : End Try
        End If
      End If
      Return m_nFrameCount
    End Get
  End Property

  Public Property frameIndex() As Integer
    Set(ByVal nFrame As Integer)
      If (nFrame > 0) And (nFrame <= FrameCount) Then
        Try
          m_Bitmap.SelectActiveFrame(FrameDimension.Page, nFrame - 1)
          m_nFrameIndex = nFrame
        Catch
        End Try
      End If
    End Set
    Get
      If m_Bitmap Is Nothing Then
        m_nFrameIndex = 0
      ElseIf m_nFrameIndex = 0 Then
        m_nFrameIndex = 1
      End If
      Return m_nFrameIndex
    End Get
  End Property
...
  Public Function Zoom(Optional ByVal nFrame As Integer = 0, _
   Optional ByVal MaxWidth As Integer = 0, _
   Optional ByVal MaxHeight As Integer = 0) As Bitmap
    Dim nActiveFrame As Integer
    Dim nSrcWidth As Integer
    Dim nSrcHeight As Integer
    Dim nDstWidth As Integer
    Dim nDstHeight As Integer
    Dim r0 As Double

    If nFrame = 0 Then
      If m_Bitmap Is Nothing Then Return Nothing
    ElseIf (nFrame > 0) And (nFrame <= FrameCount) Then
      nActiveFrame = frameIndex
      frameIndex = nFrame
    Else
      Return Nothing
    End If
...

    Dim bmDst As New Bitmap(nDstWidth, nDstHeight)
    Using gr As Graphics = Graphics.FromImage(bmDst)
      gr.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
      gr.PixelOffsetMode = Drawing2D.PixelOffsetMode.HighQuality
      gr.CompositingQuality = Drawing2D.CompositingQuality.HighQuality

      gr.CompositingMode = Drawing2D.CompositingMode.SourceOver
      gr.InterpolationMode = Drawing2D.InterpolationMode.Bilinear
      gr.DrawImage(m_Bitmap, 0, 0, nDstWidth, nDstHeight)
    End Using
    Return bmDst
  End Function

  Public Sub Clear()
    If Not m_Bitmap Is Nothing Then
      m_Bitmap.Dispose()
      m_Bitmap = Nothing
    End If
  End Sub

  Protected Overrides Sub Finalize()
    Clear()
    MyBase.Finalize()
  End Sub



Смысл. Класс загружает файл в m_Bitmap, функция Zoom генерит другой Bitmap, который отображается в Picturebox1.
При этом важно отпустить файл при смене картинки, либо когда уже не нужно ее отображать (функция Clear()).

Вопросы:
1.
Код: vbnet
1.
2.
3.
    Using gr As Graphics = Graphics.FromImage(bmDst)
...
    End Using


Надо ли что-то делать с уничтожением gr?
Т.е. надо ли делать gr.Dispose() перед End Using в этой конструкции или такой блок обеспечивает это автоматически?
Считаю что не надо.

2. Ф-ция Zoom возвращает новый bmDst As New Bitmap (нигде его не сохраняю), который я сразу присваиваю PictureBox1.Image.
Можно ли так делать и не исчезнет ли картинка в PictureBox1 при сборке мусора и т.п?

В VB6 я возвращал Create IPictureDisp FromHBITMAP(hbmDst), присваивал его Picture1.Picture причем самому hbmDst внутри Zoom DeleteObject не делал, с IPictureDisp какая-то автоматика с этим.

3. Метод Clear() за счет m_Bitmap.Dispose() разблокирует исходный файл (можно его удалить напр. после этого).
a) Надо ли его вызывать в Protected Overrides Sub Finalize(), в принципе оно и так его освобождает.
В VB6 было:
Код: vbnet
1.
2.
3.
4.
Private Sub Class_Terminate()
  If m_nBitmap Then GdipExec GdipDisposeImage(m_nBitmap)
  If m_GdipSession Then GdipExec GdiplusShutdown(m_GdipSession)
End Sub


б) В VB6 для освобождения файла было достаточно
Set m_mfi = Nothing
при том что объявлен as New он был один раз в заголовке формы.
После чего можно было снова делать m_mfi.LoadFromFile без нового New()
Здесь это все не катит, поэтому придумал m_Bitmap.Dispose() + m_Bitmap=Nothing.
Правильно?

4. Есть ли еще какие замечания по коду класса, пока не углубился?
Если честно, и в VB6 классы не особо любил.
...
Рейтинг: 0 / 0
1 сообщений из 1, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вопросы по работе с bimap/graphics -многостраничный TIFF, отображение, сохранение итд
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]